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