Путаница SQL LEFT JOIN

У меня есть пара таблиц, к которым мне нужно присоединиться.

Этот запрос возвращает 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 и накладываете ограничение на правильную таблицу (tableB в этом примере) в предложении WHERE, вы заставляете это LEFT JOIN превращаться в неявное INNER JOIN. Вместо этого переместите это условие tableB.reportDay = '2022-Apr-05' в предложение ON, чтобы ограничение записей в tableB произошло ДО того, как произойдет соединение.

JNevill 07.04.2022 20:32

вы используете LEFT JOIN, но документация относится к LEFT OUTER JOIN

Anton 07.04.2022 20:39

@Anton Это разные термины для одного и того же поведения. Технически это LEFT OUTER JOIN, а LEFT JOIN просто сокращение.

JNevill 07.04.2022 20:42

@Антон, LEFT JOIN = LEFT OUTER JOIN. OUTER в основном шум.

Adrian Klaver 07.04.2022 20:42
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
0
4
36
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Как отметил @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'

Другие вопросы по теме