С Новым годом! Форум программистов, компьютерный форум, киберфорум
Delphi: Базы данных
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/7: Рейтинг темы: голосов - 7, средняя оценка - 5.00
 Аватар для drvolodko
224 / 68 / 33
Регистрация: 23.05.2014
Сообщений: 745

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

28.06.2017, 15:22. Показов 1617. Ответов 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)
На скринах структура и результат
Миниатюры
Снова вложенный Select не выходит   Снова вложенный Select не выходит  
Изображения
 
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
28.06.2017, 15:22
Ответы с готовыми решениями:

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

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

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

18
 Аватар для krapotkin
6847 / 4674 / 1463
Регистрация: 14.04.2014
Сообщений: 20,657
Записей в блоге: 21
28.06.2017, 15:54
тут с картинками расписаны join
http://www.skillz.ru/dev/php/a... OUTER.html
0
W
 Аватар для kavasaka
115 / 115 / 33
Регистрация: 16.04.2013
Сообщений: 750
28.06.2017, 15:56
Надо 3 таблички: Подразделения-Группы-Персонал. Если даже группы нет, то ее надо вводить и дублировать название из подразделения.
0
 Аватар для krapotkin
6847 / 4674 / 1463
Регистрация: 14.04.2014
Сообщений: 20,657
Записей в блоге: 21
28.06.2017, 16:07
почему не сделать JOIN сам с собой?
1. с условием головной
2. с условием подчиненный
3. Staff
вот и три
0
 Аватар для drvolodko
224 / 68 / 33
Регистрация: 23.05.2014
Сообщений: 745
28.06.2017, 16:34  [ТС]
krapotkin, статья интересная, но как на своем примере ее реализовать я не понял. Либо тот же результат, либо + еще одна пустая строка (при Left Outer Join).
Походу придется чет мудрить с двумя по-разному открытыми таблицами.

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

Добавлено через 59 секунд
сделайте хотя бы excel таблички. можно и тут нарисовать 10 строк
0
 Аватар для drvolodko
224 / 68 / 33
Регистрация: 23.05.2014
Сообщений: 745
29.06.2017, 14:06  [ТС]
krapotkin, Closed=1 программно устанавливается сразу отделу и всем группам, входящим в состав отдела при закрытии периода оператором. Вот excel таблички.
Вложения
Тип файла: zip 1.zip (13.8 Кб, 3 просмотров)
0
 Аватар для krapotkin
6847 / 4674 / 1463
Регистрация: 14.04.2014
Сообщений: 20,657
Записей в блоге: 21
29.06.2017, 15:10
если 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
224 / 68 / 33
Регистрация: 23.05.2014
Сообщений: 745
29.06.2017, 15:40  [ТС]
Цитата Сообщение от krapotkin Посмотреть сообщение
если closed одно значение для всех, да еще требуется приблуда, чтобы выставить его автоматически, значит этому полю тут не место и оно физически должно находиться в Divisions
Divisions это справочник подразделений там не надо поле closed. Про поле head согласен, я его сделал, но не использую. При внедрении ПО уберу. Ваш мега костыль прекрасен , но, к сожалению выдает ошибку синтаксиса
Миниатюры
Снова вложенный Select не выходит  
0
 Аватар для krapotkin
6847 / 4674 / 1463
Регистрация: 14.04.2014
Сообщений: 20,657
Записей в блоге: 21
29.06.2017, 15:54
отлаживайте запрос по частям
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
224 / 68 / 33
Регистрация: 23.05.2014
Сообщений: 745
29.06.2017, 15:59  [ТС]
сейчас попробую отследить.
Цитата Сообщение от krapotkin Посмотреть сообщение
если поле Closed не в справочник, то в таблицу с отношениями 1-1 к справочнику
но точно не в Staff
closed это признак закрытия текущего отчетного периода. Каждое подразделение закрывается отдельно. Для следующего периода данные снова будут загружены в таблицу staff со значением поля closed=0. Как тогда без данного поля?
0
 Аватар для krapotkin
6847 / 4674 / 1463
Регистрация: 14.04.2014
Сообщений: 20,657
Записей в блоге: 21
29.06.2017, 16:02
поле closed изменяется СИНХРОННО у всех членов группы. т.е. это свойство не работника, а группы
где у вас таблица со свойствами групп? нигде.
а должна быть
0
 Аватар для drvolodko
224 / 68 / 33
Регистрация: 23.05.2014
Сообщений: 745
29.06.2017, 16:08  [ТС]
Первый и второй ваши варианты работают,
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
6847 / 4674 / 1463
Регистрация: 14.04.2014
Сообщений: 20,657
Записей в блоге: 21
29.06.2017, 16:15
Лучший ответ Сообщение было отмечено 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
224 / 68 / 33
Регистрация: 23.05.2014
Сообщений: 745
29.06.2017, 17:01  [ТС]
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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
29.06.2017, 17:01
Помогаю со студенческими работами здесь

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

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

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

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

Как добавить условие на вложенный select?
select eopbase.date_eop, eopspec.count, eopspec.sum_base, (select accbase.account from accbase where eopspec.rn_db = accbase.rn) as...


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

Или воспользуйтесь поиском по форуму:
19
Ответ Создать тему
Новые блоги и статьи
изучаю kubernetes
lagorue 13.01.2026
А пригодятся-ли мне знания kubernetes в России?
сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru