Вот как можно написать соединение между человеком и работой, имея в виду, что не у каждого человека есть работа. Он создает список всех людей и для каждого человека, у которого есть работа, информация о работе или все пустые значения в столбцах работы, если у них нет работы:
SELECT *
FROM
person p
LEFT JOIN job j ON p.jobid = j.id
Не имеет значения, в какую сторону Предикат (j.id = p.jobid
в порядке)
Левая таблица определяется как таблица перед словами LEFT JOIN. Левая таблица в левом соединении - это таблица "solid" - все ее строки, которые соответствуют предложению where, будут представлены. Правая таблица - это та, которая упоминается после слов RIGHT JOIN, и та, которая может стать разреженной / иметь нулевые значения во всех своих столбцах, если справа нет соответствующей строки для строки слева
Не пишите предложение where, которое затем указывает предикат в правой таблице, потому что это приведет к тому, что значения null снова исчезнут (левое соединение будет вести себя как внутреннее соединение), если только у вас нет «or righttable.column is null
», которое излишне многословно и также нуждается в тщательном заключить в скобки, если есть несколько предикатов.
Если вам нужно указать что-то, что ограничивает строки в правой таблице, вместо этого сделайте это как часть предложения ON. Вот пример запроса, который находит все 1000 человек плюс только те 100 сведений о вакансиях, где это тип работы квалифицированный вручную :
--yes, produces all 1000 people and 900 null job infos, 100 manualskilled job infos
SELECT *
FROM
person p
LEFT JOIN job j ON p.jobid = j.id AND j.jobtype ='manualskilled'
--no, produces just 100 rows, 900 people are missing
SELECT *
FROM
person p
LEFT JOIN job j ON p.jobid = j.id
WHERE
j.jobtype = 'manualskilled'
Это происходит потому, что в типе задания NULL, введенный левым соединением, удаляется при сравнении с константной строкой 'manualskilled'. Все, что сравнивается с NULL, неизвестно, что никогда не соответствует действительности. То, что не соответствует истине в предложении where, не может превратить его в выходной набор результатов, как вы сейчас обнаруживаете в своем запросе!
О, и последний момент, о котором стоит упомянуть; будьте осторожны при смешивании внутренних, левых и правых объединений, поскольку это может оказать глубокое влияние на вывод запроса. Вы, вероятно, будете ближе всего к тому, что вы логически ожидаете, если сначала выполните все свои внутренние объединения, затем свои левые, и если вам нужно объединить какие-либо таблицы в таблицу, к которой вы уже присоединились, то снова используйте левое соединение. Избегайте использования правых соединений вообще (перепишите их наоборот, чтобы они были левыми). Если вы внутренне соединяете таблицу с таблицей, которая была оставлена объединенной, строки снова исчезнут, так как «ноль не может быть сопоставлен с другим значением и будет получено истинное значение»