«Если рабочий хочет хорошо выполнять свою работу, он должен сначала заточить свои инструменты» — Конфуций, «Аналитики Конфуция. Лу Лингун»
титульная страница > программирование > Переверняет ли внутреннее соединение включение нулевых значений внешнего соединения?

Переверняет ли внутреннее соединение включение нулевых значений внешнего соединения?

Опубликовано в 2025-03-13
Просматривать:545

Does an INNER JOIN Override an OUTER JOIN's Inclusion of NULL Values?

комплексные запросы 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 вместо

Inner 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