Проблемы с получением желаемого результата из SQL JOIN Query - PullRequest
0 голосов
/ 17 октября 2019

Попытка извлечь данные из нескольких таблиц SQL. У меня есть основной стол и пара вспомогательных столов. Я хочу получить все строки из основной таблицы с заданным условием и добавить некоторые поля из вложенных таблиц. Я подумал, что OUTER JOIN должно сработать, но я не получаю полные данные.

Когда я запускаю COUNT в основной таблице с условием, я получаю ~ 10k строк, что я и ожидаюполучить, как только я присоединяюсь к другим столам. Я понимаю, что я получу значения NULL для некоторых записей строк.

Это запрос, который я создал, но я получаю только частичные результаты

SELECT main_table.group_id, main_table.floor, sub_table1.Name, sub_table2.base
FROM main_table
LEFT JOIN ON main_table.group_id =sub_table1.group_id
LEFT JOIN ON main_table.group_id =sub_table2.group_id
WHERE main_table.year = 2000 AND sub_table1.year = 2000 
AND sub_table2.year = 2000 AND main_table.group = 'C'

Я ожидаю увидеть коллекциюоколо 10 тыс. строк, поскольку это число, которое я получаю, когда запрашиваю только основную таблицу с предложением where.

SELECT COUNT(*) FROM main_table WHERE year = 2000 AND group = 'C';

Ответы [ 2 ]

1 голос
/ 17 октября 2019

Ваше предложение where отфильтровывает дополнительные строки из внешних объединений - фактически превращая их во внутренние объединения.

Условия для всех, кроме первой таблицы, должны быть в предложениях on. Но я бы сформулировал это следующим образом:

SELECT main_table.group_id, main_table.floor, sub_table1.Name, sub_table2.base
FROM main_table LEFT JOIN
     sub_table1
     ON main_table.group_id = sub_table1.group_id AND
        main_table.year = sub_table1.year LEFT JOIN
     sub_table2
     ON main_table.group_id = sub_table2.group_id AND
        main_table.year = sub_table2.year
WHERE main_table.year = 2000 AND main_table.group = 'C';

Вы хотите, чтобы year были равны, так что это действительно должно быть JOIN условие. Тогда вам нужно только один раз указать год в предложении WHERE.

0 голосов
/ 17 октября 2019

Какое бы условие в предложении ON не использовалось для объединения, а условие в предложении WHERE - для фильтрации окончательного результата.

Помимо ответа Гордона, если ваше требование включать разные / одинаковые годыв присоединениях вы можете использовать следующий запрос:

SELECT main_table.group_id, main_table.floor, sub_table1.Name, sub_table2.base
FROM main_table LEFT JOIN
     sub_table1
     ON (main_table.group_id = sub_table1.group_id AND
        sub_table1.year = 2000) LEFT JOIN
     sub_table2
     ON (main_table.group_id = sub_table2.group_id AND
        sub_table2.year = 2000)
WHERE main_table.year = 2000 AND main_table.group = 'C';

Cheers !!

...