Трябва да разберете по-добре как работи LEFT JOIN (външни съединения като цяло - ляво/дясно и пълно [външно] съединение)
LEFT JOIN винаги се изпълнява в две стъпки:
SELECT ....FROM table1LEFT JOIN table1 ON join_conditionsWHERE where_conditions
Стъпка 1 - първо се изпълнява LEFT JOIN (като се използват условия, определени в клауза ON за свързване на две таблици)
Стъпка 2 - условията WHERE се прилагат към резултат, генериран от съединението в стъпка 1
Как работи LEFT JOIN - бързо напомняне:LEFT JOIN връща винаги ВСИЧКИ редове от лявата таблица, дори тези редове, за които няма съвпадение в дясната таблица. Когато няма съвпадение (условието ON се оценява на false), LEFT JOIN връща NULL за дясната таблица.
RIGHT JOIN работи по същия начин, но връща всички редове от таблицата RIGHT, а не лявата като LEFT JOIN.
И така, ако имате това запитване:
SELECT S.GROUP,S.TABLE_ID,H.RUN_DATE,H.STATUS FROM source_table S LEFT JOIN HISTORY HON S.TABLE_ID=H.TABLE_IDWHERE H.STATUS='COMPLETED'
базата данни първо изпълнява LEFT JOIN, тоест:
SELECT S.GROUP,S.TABLE_ID,H.RUN_DATE,H.STATUS FROM source_table S LEFT JOIN HISTORY HON S.TABLE_ID=H.TABLE_ID
Горната заявка дава следния резултат (забележете NULL в последните 3 реда от дясната страна):
<предварителен код>| S.GROUP | S.TABLE_ID | H.RUN_DATE | H.СТАТУС ||-----------|------------|-------------------- --------|-----------|| Продажби | 1210 | 05 януари 2016 г. 00:00:00 | ЗАВЪРШЕН || Продажби | 1210 | 05 февруари 2016 г. 00:00:00 | ЗАВЪРШЕН || Справка | 1211 | 05 февруари 2016 г. 00:00:00 | ЗАВЪРШЕН || Справка | 1211 | 05 март 2016 г. 00:00:00 | ЗАВЪРШЕН || Маркетинг | 1230 | 05 януари 2016 г. 00:00:00 | ЗАВЪРШЕН || Маркетинг | 1230 | 05 март 2016 г. 00:00:00 | ЗАВЪРШЕН || Продажби | 1245 | (нула) | (нула) || Справка | 1650 | (нула) | (нула) || Продажби | 1784 | (нула) | (null) |След това базата данни изпълнява условието WHERE върху горния набор от резултати:
WHERE H.STATUS='COMPLETED'
Тъй като NULL='COMPLETED'
се оценява на FALSE, тогава крайният резултат от заявката е:
тоест:всички NULL бяха пропуснати.
Вижте тази демонстрация:http://sqlfiddle .com/#!9/e2ed0/3
Ако искате да получавате и записи с NULL стойности, трябва да промените това условие на:
WHERE ( H.STATUS='COMPLETED' OR H.STATUS IS NULL )
можете също да премахнете това условие от клаузата WHERE и да го добавите към условието ON на LEFT JOIN, което е:
SELECT S.GROUP,S.TABLE_ID,H.RUN_DATE,H.STATUS FROM source_table S LEFT JOIN HISTORY HON ( S.TABLE_ID=H.TABLE_ID И H.STATUS='COMPLETED' )
вижте последната заявка в тази демонстрация:http://sqlfiddle.com/#!9/e2ed0 /3