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

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

28.06.2017, 15:22. Показов 1649. Ответов 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
6849 / 4676 / 1464
Регистрация: 14.04.2014
Сообщений: 20,670
Записей в блоге: 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
6849 / 4676 / 1464
Регистрация: 14.04.2014
Сообщений: 20,670
Записей в блоге: 21
28.06.2017, 16:07
почему не сделать JOIN сам с собой?
1. с условием головной
2. с условием подчиненный
3. Staff
вот и три
0
 Аватар для drvolodko
224 / 68 / 33
Регистрация: 23.05.2014
Сообщений: 752
28.06.2017, 16:34  [ТС]
krapotkin, статья интересная, но как на своем примере ее реализовать я не понял. Либо тот же результат, либо + еще одна пустая строка (при Left Outer Join).
Походу придется чет мудрить с двумя по-разному открытыми таблицами.

Добавлено через 1 минуту
Цитата Сообщение от krapotkin Посмотреть сообщение
почему не сделать JOIN сам с собой?
1. с условием головной
2. с условием подчиненный
3. Staff
вот и три
Можно вот тут подробнее?
0
 Аватар для krapotkin
6849 / 4676 / 1464
Регистрация: 14.04.2014
Сообщений: 20,670
Записей в блоге: 21
28.06.2017, 16:45
давайте конкретный пример
что нужно вывести ?
0
 Аватар для drvolodko
224 / 68 / 33
Регистрация: 23.05.2014
Сообщений: 752
29.06.2017, 09:48  [ТС]
krapotkin, конкретно мне необходимо группы и бригады, входящие в состав отдела сгруппировать в отдел и вывести информацию закрыт ли период в отделе, а не по отдельным группам. В данном конкретном случае приведен пример на бухгалтерии. Этот отдел разбит в таблице staff на 8 групп (база еще не наполнена поэтому тут только три группы 16ЦБ-0225, 16ЦБ-0227 и 16ЦБ-0023). Эти группы должны в отчете отобразиться как Бухгалтерия 16ЦБ-0021, которая указана в таблице divisions, как головной отдел для этих групп. А сейчас у меня, как видно из результата, Бухгалтерия 16ЦБ-0021 вообще в списке отсутствует. И таких бригад будет ппц как много в дальнейшем. В одной только механо-ремонтной службе 25 бригад, а отобразиться они должны будут, как единая МРС.
0
 Аватар для krapotkin
6849 / 4676 / 1464
Регистрация: 14.04.2014
Сообщений: 20,670
Записей в блоге: 21
29.06.2017, 10:04
воу. палехче))
конкретно - это значит мы приводим конкретные данные для двух отделов
вводим туда по два-три работника.
публикуем тут эти данные! ))
и рисуем таблицу с данными, которую должны получить в результате запроса
0
 Аватар для drvolodko
224 / 68 / 33
Регистрация: 23.05.2014
Сообщений: 752
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
6849 / 4676 / 1464
Регистрация: 14.04.2014
Сообщений: 20,670
Записей в блоге: 21
29.06.2017, 13:20
у меня нет аксесса, поэтому только на пальцах
при каких условиях Closed=1 ? когда все группы =1 или одна из групп =1?

Добавлено через 59 секунд
сделайте хотя бы excel таблички. можно и тут нарисовать 10 строк
0
 Аватар для drvolodko
224 / 68 / 33
Регистрация: 23.05.2014
Сообщений: 752
29.06.2017, 14:06  [ТС]
krapotkin, Closed=1 программно устанавливается сразу отделу и всем группам, входящим в состав отдела при закрытии периода оператором. Вот excel таблички.
Вложения
Тип файла: zip 1.zip (13.8 Кб, 3 просмотров)
0
 Аватар для krapotkin
6849 / 4676 / 1464
Регистрация: 14.04.2014
Сообщений: 20,670
Записей в блоге: 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
Сообщений: 752
29.06.2017, 15:40  [ТС]
Цитата Сообщение от krapotkin Посмотреть сообщение
если closed одно значение для всех, да еще требуется приблуда, чтобы выставить его автоматически, значит этому полю тут не место и оно физически должно находиться в Divisions
Divisions это справочник подразделений там не надо поле closed. Про поле head согласен, я его сделал, но не использую. При внедрении ПО уберу. Ваш мега костыль прекрасен , но, к сожалению выдает ошибку синтаксиса
Миниатюры
Снова вложенный Select не выходит  
0
 Аватар для krapotkin
6849 / 4676 / 1464
Регистрация: 14.04.2014
Сообщений: 20,670
Записей в блоге: 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
Сообщений: 752
29.06.2017, 15:59  [ТС]
сейчас попробую отследить.
Цитата Сообщение от krapotkin Посмотреть сообщение
если поле Closed не в справочник, то в таблицу с отношениями 1-1 к справочнику
но точно не в Staff
closed это признак закрытия текущего отчетного периода. Каждое подразделение закрывается отдельно. Для следующего периода данные снова будут загружены в таблицу staff со значением поля closed=0. Как тогда без данного поля?
0
 Аватар для krapotkin
6849 / 4676 / 1464
Регистрация: 14.04.2014
Сообщений: 20,670
Записей в блоге: 21
29.06.2017, 16:02
поле closed изменяется СИНХРОННО у всех членов группы. т.е. это свойство не работника, а группы
где у вас таблица со свойствами групп? нигде.
а должна быть
0
 Аватар для drvolodko
224 / 68 / 33
Регистрация: 23.05.2014
Сообщений: 752
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
6849 / 4676 / 1464
Регистрация: 14.04.2014
Сообщений: 20,670
Записей в блоге: 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
Сообщений: 752
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
Ответ Создать тему
Новые блоги и статьи
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru