комплексные запросы SQL часто используют несколько операций соединения, объединяя различные типы соединений. Ключевым соображением является то, как влияет включение нулевых значений, характеристика внешних соединений, когда впоследствии применяется внутреннее соединение. ]
, как внутренние соединения могут повлиять на результаты внешнего соединения
] внутреннее соединение по своей природе возвращает только ряды, где условие соединения выполняется в оба
таблицы. Если внутреннее соединение следует за внешним соединением, и условие внутреннего соединения опирается на столбцы, которые могут быть нулевыми (из -за внешнего соединения), оно эффективно фильтрует ряды, где эти столбцы являются нулевыми. Это отрицает включение нулевых значений, которые первоначально предоставлено внешнее соединение.] иллюстративный пример
давайте рассмотрим сценарий:
ВЫБИРАТЬ * От человека Оставленный адрес присоединения на Person.address_id = address.id Внутреннее присоединение по электронной почте на Person.email_id = email.id;]
SELECT *
FROM person
LEFT JOIN address ON person.address_id = address.id
INNER JOIN email ON person.email_id = email.id;
включены, даже если в адрес нет соответствующей записи
. Однако Inner quip
с email
затем ограничивает результаты только для тех строк, где сопоставление email_id
существует в обоих Person
и email
. Rows From Person
, у которого было сопоставление address
, но null email_id
будет исключен.
проблемный сценарий и его решение
рассмотрим этот запрос: ]
ВЫБИРАТЬ * От человека Оставленный адрес присоединения на Person.address_id = address.id Inner Join City по адресу.city_id = city.id;]
SELECT *
FROM person
LEFT JOIN address ON person.address_id = address.id
INNER JOIN city ON address.city_id = city.id;
city предполагает, что address.city_id
никогда не является нулевым. Если в некоторых адресах не хватает City_id
, эти строки (и Associated Person
Rows) будут опущены, непреднамеренно изменяя результаты начального Left Join
. ]
Правильный подход состоит в том, чтобы использовать другой Left join
вместо
: ]
ВЫБИРАТЬ *
От человека
Оставленный адрес присоединения на Person.address_id = address.id
Left Join City по адресу.city_id = city.id;
SELECT *
FROM person
LEFT JOIN address ON person.address_id = address.id
LEFT JOIN city ON address.city_id = city.id;
address.city_id может быть нулевым. Это гарантирует, что все записи
включены, независимо от того, имеют ли они адрес или город, связанный с ними. ]
Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.
Copyright© 2022 湘ICP备2022001581号-3