Форум программистов, компьютерный форум, киберфорум
Наши страницы
Delphi: Базы данных
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.60/5: Рейтинг темы: голосов - 5, средняя оценка - 4.60
drvolodko
210 / 55 / 31
Регистрация: 23.05.2014
Сообщений: 541
1

Снова вложенный Select не выходит

28.06.2017, 15:22. Просмотров 886. Ответов 18
Метки нет (Все метки)

И снова здравствуйте. Имеются 2 таблички Divisions - список подразделений и Staff - персонал. Не могу никак организовать правильную выборку. В подразделениях есть и группы (подчиненные подразделения) и сами головные подразделения, а вот в staff головного подразделения, как оказалось, может и не быть, а только группы этого подразделения. Как выбрать и головное подразделение, и эти самые группы, но в результате вывести только головное? Пробовал несколько модификаций такого запроса, но не выходит каменный цветок - вместо бухгалтерии её подчиненные группы
SQL
1
2
3
SELECT DISTINCT Staff.closed, divisions.division
FROM staff, divisions WHERE Staff.code_div=divisions.n_div OR
Staff.code_div IN (SELECT divisions.n_div FROM divisions WHERE divisions.headnum=Staff.code_div)
На скринах структура и результат
0
Миниатюры
Снова вложенный Select не выходит   Снова вложенный Select не выходит  
Изображения
 
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
28.06.2017, 15:22
Ответы с готовыми решениями:

Снова Update не выходит
Доброго дня, господа. Задачка вот такая: есть две таблицы: 1. Div -...

вложенный SELECT
День добрый! Я что-то подзабыл как делать вложенный селект :( Или нужно...

Вложенный Select
Добрый вечер, помогите разобрать запросы, хочу понять алгоритмы решения....

Вложенный SELECT
Подскажите, каким образом организовать следующее: Имеется 3 таблицы, таблица с...

Select и вложенный запрос
Добрый день уважаемые форумчане.UPDATE `contacts` SET `operator_id`=(SELECT...

18
krapotkin
3418 / 3025 / 1047
Регистрация: 14.04.2014
Сообщений: 14,677
Записей в блоге: 15
28.06.2017, 15:54 2
тут с картинками расписаны join
http://www.skillz.ru/dev/php/article...NER_OUTER.html
0
kavasaka
113 / 113 / 33
Регистрация: 16.04.2013
Сообщений: 687
28.06.2017, 15:56 3
Надо 3 таблички: Подразделения-Группы-Персонал. Если даже группы нет, то ее надо вводить и дублировать название из подразделения.
0
krapotkin
3418 / 3025 / 1047
Регистрация: 14.04.2014
Сообщений: 14,677
Записей в блоге: 15
28.06.2017, 16:07 4
почему не сделать JOIN сам с собой?
1. с условием головной
2. с условием подчиненный
3. Staff
вот и три
0
drvolodko
210 / 55 / 31
Регистрация: 23.05.2014
Сообщений: 541
28.06.2017, 16:34  [ТС] 5
krapotkin, статья интересная, но как на своем примере ее реализовать я не понял. Либо тот же результат, либо + еще одна пустая строка (при Left Outer Join).
Походу придется чет мудрить с двумя по-разному открытыми таблицами.

Добавлено через 1 минуту
Цитата Сообщение от krapotkin Посмотреть сообщение
почему не сделать JOIN сам с собой?
1. с условием головной
2. с условием подчиненный
3. Staff
вот и три
Можно вот тут подробнее?
0
krapotkin
3418 / 3025 / 1047
Регистрация: 14.04.2014
Сообщений: 14,677
Записей в блоге: 15
28.06.2017, 16:45 6
давайте конкретный пример
что нужно вывести ?
0
drvolodko
210 / 55 / 31
Регистрация: 23.05.2014
Сообщений: 541
29.06.2017, 09:48  [ТС] 7
krapotkin, конкретно мне необходимо группы и бригады, входящие в состав отдела сгруппировать в отдел и вывести информацию закрыт ли период в отделе, а не по отдельным группам. В данном конкретном случае приведен пример на бухгалтерии. Этот отдел разбит в таблице staff на 8 групп (база еще не наполнена поэтому тут только три группы 16ЦБ-0225, 16ЦБ-0227 и 16ЦБ-0023). Эти группы должны в отчете отобразиться как Бухгалтерия 16ЦБ-0021, которая указана в таблице divisions, как головной отдел для этих групп. А сейчас у меня, как видно из результата, Бухгалтерия 16ЦБ-0021 вообще в списке отсутствует. И таких бригад будет ппц как много в дальнейшем. В одной только механо-ремонтной службе 25 бригад, а отобразиться они должны будут, как единая МРС.
0
krapotkin
3418 / 3025 / 1047
Регистрация: 14.04.2014
Сообщений: 14,677
Записей в блоге: 15
29.06.2017, 10:04 8
воу. палехче))
конкретно - это значит мы приводим конкретные данные для двух отделов
вводим туда по два-три работника.
публикуем тут эти данные! ))
и рисуем таблицу с данными, которую должны получить в результате запроса
0
drvolodko
210 / 55 / 31
Регистрация: 23.05.2014
Сообщений: 541
29.06.2017, 11:58  [ТС] 9
krapotkin, Вот БД с двумя таблицами. Если поле Headnum пустое, то это головное подразделение, иначе подчиненное. Нужно из них получить на выходе:
Наименование отдела (Division), код отдела (n_div) закрытие (closed)
Отдел автоматизации 1014 1
МРС 2070 0
Бухгалтерия 16ЦБ-0021 1
Никаких групп и бригад. Они должны сгруппироваться в головной отдел. Но, как говорит мой двухгодовалый сынишка, когда что-то не получается - "не опля"
0
Вложения
Тип файла: zip DB1.zip (14.9 Кб, 1 просмотров)
krapotkin
3418 / 3025 / 1047
Регистрация: 14.04.2014
Сообщений: 14,677
Записей в блоге: 15
29.06.2017, 13:20 10
у меня нет аксесса, поэтому только на пальцах
при каких условиях Closed=1 ? когда все группы =1 или одна из групп =1?

Добавлено через 59 секунд
сделайте хотя бы excel таблички. можно и тут нарисовать 10 строк
0
drvolodko
210 / 55 / 31
Регистрация: 23.05.2014
Сообщений: 541
29.06.2017, 14:06  [ТС] 11
krapotkin, Closed=1 программно устанавливается сразу отделу и всем группам, входящим в состав отдела при закрытии периода оператором. Вот excel таблички.
0
Вложения
Тип файла: zip 1.zip (13.8 Кб, 2 просмотров)
krapotkin
3418 / 3025 / 1047
Регистрация: 14.04.2014
Сообщений: 14,677
Записей в блоге: 15
29.06.2017, 15:10 12
если closed одно значение для всех, да еще требуется приблуда, чтобы выставить его автоматически, значит этому полю тут не место и оно физически должно находиться в Divisions
поле Head - абсолютно нелепое и не нужно вообще

сейчас же просто мегакостыль

SQL
1
2
3
4
5
SELECT DISTINCT d_main.division, d_main.n_div, s.closed
FROM divisions d_main 
  LEFT JOIN divisions d_1 ON (d_1.HeadNum=d_main.N-div)
  LEFT JOIN staff s ON (s.code_div=d_1.N_div)
WHERE (d_main.headnum='' OR d_main.headnum IS NULL)
0
drvolodko
210 / 55 / 31
Регистрация: 23.05.2014
Сообщений: 541
29.06.2017, 15:40  [ТС] 13
Цитата Сообщение от krapotkin Посмотреть сообщение
если closed одно значение для всех, да еще требуется приблуда, чтобы выставить его автоматически, значит этому полю тут не место и оно физически должно находиться в Divisions
Divisions это справочник подразделений там не надо поле closed. Про поле head согласен, я его сделал, но не использую. При внедрении ПО уберу. Ваш мега костыль прекрасен , но, к сожалению выдает ошибку синтаксиса
0
Миниатюры
Снова вложенный Select не выходит  
krapotkin
3418 / 3025 / 1047
Регистрация: 14.04.2014
Сообщений: 14,677
Записей в блоге: 15
29.06.2017, 15:54 14
отлаживайте запрос по частям
SQL
1
2
3
SELECT DISTINCT d_main.division, d_main.n_div
FROM divisions d_main 
WHERE (d_main.headnum='' OR d_main.headnum IS NULL)
SQL
1
2
3
4
SELECT DISTINCT d_main.division, d_main.n_div
FROM divisions d_main 
  LEFT JOIN divisions d_1 ON (d_1.HeadNum=d_main.N-div)
WHERE (d_main.headnum='' OR d_main.headnum IS NULL)
SQL
1
2
3
4
5
SELECT DISTINCT d_main.division, d_main.n_div, s.closed
FROM divisions d_main 
  LEFT JOIN divisions d_1 ON (d_1.HeadNum=d_main.N-div)
  LEFT JOIN staff s ON (s.code_div=d_1.N_div)
WHERE (d_main.headnum='' OR d_main.headnum IS NULL)
Добавлено через 1 минуту
если поле Closed не в справочник, то в таблицу с отношениями 1-1 к справочнику
но точно не в Staff

плохо видно. но ошибка : n-div а надо было N_DIV
0
drvolodko
210 / 55 / 31
Регистрация: 23.05.2014
Сообщений: 541
29.06.2017, 15:59  [ТС] 15
сейчас попробую отследить.
Цитата Сообщение от krapotkin Посмотреть сообщение
если поле Closed не в справочник, то в таблицу с отношениями 1-1 к справочнику
но точно не в Staff
closed это признак закрытия текущего отчетного периода. Каждое подразделение закрывается отдельно. Для следующего периода данные снова будут загружены в таблицу staff со значением поля closed=0. Как тогда без данного поля?
0
krapotkin
3418 / 3025 / 1047
Регистрация: 14.04.2014
Сообщений: 14,677
Записей в блоге: 15
29.06.2017, 16:02 16
поле closed изменяется СИНХРОННО у всех членов группы. т.е. это свойство не работника, а группы
где у вас таблица со свойствами групп? нигде.
а должна быть
0
drvolodko
210 / 55 / 31
Регистрация: 23.05.2014
Сообщений: 541
29.06.2017, 16:08  [ТС] 17
Первый и второй ваши варианты работают,
SQL
1
2
3
4
SELECT DISTINCT d_main.division, d_main.n_div, s.closed
FROM divisions d_main 
    LEFT JOIN staff s ON (s.code_div=d_main.N_div)
WHERE (d_main.headnum='' OR d_main.headnum IS NULL)
тоже работает, но бухгалтерия closed получается NULL, а вот полностью выдает ошибку
0
krapotkin
3418 / 3025 / 1047
Регистрация: 14.04.2014
Сообщений: 14,677
Записей в блоге: 15
29.06.2017, 16:15 18
Лучший ответ Сообщение было отмечено drvolodko как решение

Решение

значит у аксесса есть какие-то нестандартные дополнения по использованию нескольких left join
может скобок ему каких-нить добавить
SQL
1
2
3
4
5
SELECT DISTINCT d_main.division, d_main.n_div, s.closed
FROM (divisions d_main 
  LEFT JOIN divisions d_1 ON (d_1.HeadNum=d_main.N_div))
  LEFT JOIN staff s ON (s.code_div=d_1.N_div)
WHERE (d_main.headnum='' OR d_main.headnum IS NULL)
1
drvolodko
210 / 55 / 31
Регистрация: 23.05.2014
Сообщений: 541
29.06.2017, 17:01  [ТС] 19
krapotkin, проверил на MS SQL и доработал ваш запрос (добавил условие) и все заработало!!!!!
Delphi
1
2
3
4
5
sql.text:='SELECT DISTINCT d_main.division, d_main.n_div, s.closed '+
          'FROM divisions d_main '+
          'LEFT JOIN divisions d_1 ON (d_1.HeadNum=d_main.N_div) '+
          'LEFT JOIN staff s ON (s.code_div=d_1.N_div or s.code_div=d_main.n_div) '+
          'WHERE (d_main.headnum='''' OR d_main.headnum IS NULL)';
Честно сказать жаль, что в теме можно только один раз сказать спасибо. Но хотя бы так: +100500 вам спасибо!!!
0
29.06.2017, 17:01
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
29.06.2017, 17:01

Не работает вложенный Select
Использую SQL Server Compact Edition. Есть две таблицы (1-й скрин). Пишу вот...

TRANSFORM PIVOT + вложенный SELECT
Здравствуйте! Не пойму как решить проблему, делаю разворот таблицы, с обычной...

Как добавить условие на вложенный select?
select eopbase.date_eop, eopspec.count, eopspec.sum_base, (select...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
19
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru