У меня есть пара таблиц, к которым мне нужно присоединиться.
Этот запрос возвращает 1164 записи.
SELECT name FROM tableA
WHERE reportDay = '2022-Apr-05'
И этот возвращает 3339 записей
SELECT name FROM tableB
WHERE reportDay = '2022-Apr-05'
Выполнение LEFT JOIN должно (согласно различным интернет-учебникам) возвращать все записи в tableA
, а также все записи в tableB
с NULL, где нет соответствующей строки в tableB
Однако это возвращает 1134 записи. Так что 30 записей из tableA
больше не возвращаются
SELECT tableA.name, tableB.name
FROM tableA
LEFT JOIN tableB ON tableA.name = tableB.name
WHERE tableA.reportDay = '2022-Apr-05'
AND tableB.reportDay = '2022-Apr-05'
Где я ошибаюсь? - Я проверил, что в обеих таблицах поле "имя" уникально по дням (т.е. только одна запись в день)
Цитата из документации POSTGRES
LEFT OUTER JOIN returns all rows in the qualified Cartesian product (i.e., all combined rows that pass its join condition), plus one copy of each row in the left-hand table for which there was no right-hand row that passed the join condition.
Я признаю, что не уверен в значении «квалифицированный декартовский продукт», но вторая половина предложения, кажется, предполагает, что я должен получить все строки из tableA
и NULLS, где совпадение не найдено в tableB
ОБНОВЛЕНИЕ - черт возьми, это было быстро! Спасибо, ребята, я должен был спросить раньше, сэкономил бы час моей жизни.
вы используете LEFT JOIN
, но документация относится к LEFT OUTER JOIN
@Anton Это разные термины для одного и того же поведения. Технически это LEFT OUTER JOIN
, а LEFT JOIN
просто сокращение.
@Антон, LEFT JOIN
= LEFT OUTER JOIN
. OUTER
в основном шум.
Как отметил @JNevil, критерии должны быть включены в пункт ON
.
SELECT
tableA.name, tableB.name
FROM tableA
LEFT JOIN tableB
ON (tableA.name = tableB.name and tableB.reportDay = '2022-Apr-05')
WHERE tableA.reportDay = '2022-Apr-05'
Всякий раз, когда вы делаете
LEFT JOIN
и накладываете ограничение на правильную таблицу (tableB
в этом примере) в предложенииWHERE
, вы заставляете этоLEFT JOIN
превращаться в неявноеINNER JOIN
. Вместо этого переместите это условиеtableB.reportDay = '2022-Apr-05'
в предложениеON
, чтобы ограничение записей вtableB
произошло ДО того, как произойдет соединение.