Oracle
 sql >> база данни >  >> RDS >> Oracle

Oracle- Лявото външно съединение на множество таблици не връща желаните нулеви стойности

Трябва да разберете по-добре как работи 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, тогава крайният резултат от заявката е:

<предварителен код>| ГРУПА | TABLE_ID | RUN_DATE | СТАТУТ ||-----------|----------|------------------------ ----|-----------|| Продажби | 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 | ЗАВЪРШЕНО |

тоест:всички 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




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Как да намалите времето за изпълнение на заявка за таблица с огромни данни

  2. конвертирайте в ПРОЦЕДУРА pl/sql

  3. изберете от една таблица, вмъкнете в друга таблица oracle sql заявка

  4. Автономни транзакции в Sybase ASE 15.5

  5. Свързване на Oracle 21c към SQL Server