sql >> Databáze >  >> RDS >> Oracle

Oracle- Levé vnější spojení na více tabulkách nevrací požadované hodnoty null

Musíte lépe porozumět tomu, jak funguje LEFT JOIN (vnější spojení obecně – levé/pravé a úplné [vnější] spojení)

LEFT JOIN se vždy provádí ve dvou krocích:

SELECT ....
FROM table1
LEFT JOIN table1 ON join_conditions
WHERE where_conditions

Krok 1 – nejprve se provede LEFT JOIN (pomocí podmínek specifikovaných v klauzuli ON ke spojení dvou tabulek)
Krok 2 – podmínky WHERE se použijí na výsledek vygenerovaný spojením v kroku 1

Jak funguje LEFT JOIN - rychlé připomenutí:LEFT JOIN vrací vždy VŠECHNY řádky z levé tabulky, dokonce i ty řádky, pro které neexistuje shoda v pravé tabulce. Pokud nedojde k žádné shodě (podmínka ON se vyhodnotí jako nepravda), LEFT JOIN vrátí hodnoty NULL pro pravou tabulku.
RIGHT JOIN funguje stejným způsobem, ale vrátí všechny řádky z tabulky RIGHT, nikoli levý. jako LEFT JOIN.

Takže pokud máte tento dotaz:

SELECT S.GROUP,S.TABLE_ID,H.RUN_DATE,H.STATUS 
FROM source_table S 
LEFT JOIN HISTORY H
ON S.TABLE_ID=H.TABLE_ID
WHERE H.STATUS='COMPLETED'

databáze nejprve provede LEFT JOIN, tedy:

SELECT S.GROUP,S.TABLE_ID,H.RUN_DATE,H.STATUS 
FROM source_table S 
LEFT JOIN HISTORY H
ON S.TABLE_ID=H.TABLE_ID

Výše uvedený dotaz dává následující výsledek (všimněte si NULL v posledních 3 řádcích na pravé straně):

|   S.GROUP | S.TABLE_ID |                 H.RUN_DATE |  H.STATUS |
|-----------|------------|----------------------------|-----------|
|     Sales |       1210 |  January, 05 2016 00:00:00 | COMPLETED |
|     Sales |       1210 | February, 05 2016 00:00:00 | COMPLETED |
| Reference |       1211 | February, 05 2016 00:00:00 | COMPLETED |
| Reference |       1211 |    March, 05 2016 00:00:00 | COMPLETED |
| Marketing |       1230 |  January, 05 2016 00:00:00 | COMPLETED |
| Marketing |       1230 |    March, 05 2016 00:00:00 | COMPLETED |
|     Sales |       1245 |                     (null) |    (null) |
| Reference |       1650 |                     (null) |    (null) |
|     Sales |       1784 |                     (null) |    (null) |

A poté databáze provede podmínku WHERE na výše uvedené sadě výsledků:

WHERE H.STATUS='COMPLETED'

Od NULL='COMPLETED' vyhodnotí jako FALSE, pak konečný výsledek dotazu je:

|     GROUP | TABLE_ID |                   RUN_DATE |    STATUS |
|-----------|----------|----------------------------|-----------|
|     Sales |     1210 |  January, 05 2016 00:00:00 | COMPLETED |
|     Sales |     1210 | February, 05 2016 00:00:00 | COMPLETED |
| Reference |     1211 | February, 05 2016 00:00:00 | COMPLETED |
| Reference |     1211 |    March, 05 2016 00:00:00 | COMPLETED |
| Marketing |     1230 |  January, 05 2016 00:00:00 | COMPLETED |
| Marketing |     1230 |    March, 05 2016 00:00:00 | COMPLETED |

to znamená:všechny hodnoty NULL byly přeskočeny.
Podívejte se na tuto ukázku:http://sqlfiddle .com/#!9/e2ed0/3

Pokud chcete získat také záznamy s hodnotami NULL, musíte tuto podmínku změnit na:

WHERE ( H.STATUS='COMPLETED' OR H.STATUS IS NULL )

můžete také odstranit tuto podmínku z klauzule WHERE a přidat ji do podmínky ON LEFT JOIN, tedy:

SELECT S.GROUP,S.TABLE_ID,H.RUN_DATE,H.STATUS 
FROM source_table S 
LEFT JOIN HISTORY H
ON ( S.TABLE_ID=H.TABLE_ID AND H.STATUS='COMPLETED' )

viz poslední dotaz v této ukázce:http://sqlfiddle.com/#!9/e2ed0 /3




  1. Jak najít informace o datových typech ve schématu oracle?

  2. PHP/HTML Přidat a odebrat tlačítko

  3. Co řídí pořadí přirozeného výsledku pro neuspořádaný požadavek MySQL

  4. Jak make_timestamptz() funguje v PostgreSQL