Du skal få en bedre forståelse af, hvordan en LEFT JOIN fungerer (ydre joinforbindelse generelt - venstre/højre og fuld [ydre] join)
LEFT JOIN udføres altid i to trin:
SELECT ....
FROM table1
LEFT JOIN table1 ON join_conditions
WHERE where_conditions
Trin 1 - LEFT JOIN udføres først (ved at bruge betingelser specificeret i ON-klausulen for at forbinde to tabeller)
Trin 2 - WHERE-betingelserne anvendes på et resultat genereret af joinforbindelsen i trin 1
Sådan fungerer LEFT JOIN - en hurtig påmindelse:LEFT JOIN returnerer altid ALLE rækker fra den venstre tabel, selv disse rækker, som der ikke er nogen match for i den højre tabel. Når der ikke er noget match (ON-betingelsen evalueres til falsk), returnerer LEFT JOIN NULLs for den højre tabel.
RIGHT JOIN fungerer på samme måde, men den returnerer alle rækker fra den HØJRE tabel, ikke den venstre. som VENSTRE JOIN.
SÅ hvis du har denne forespørgsel:
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'
databasen udfører først LEFT JOIN, det vil sige:
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
Ovenstående forespørgsel giver følgende resultat (bemærk NULL i de sidste 3 rækker på højre side):
| 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) |
Og så udfører databasen WHERE-betingelsen på ovenstående resultatsæt:
WHERE H.STATUS='COMPLETED'
Siden NULL='COMPLETED'
evalueres til FALSK, så er det endelige resultat af forespørgslen:
| 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 |
det vil sige:alle NULL'er blev sprunget over.
Se denne demo:http://sqlfiddle .com/#!9/e2ed0/3
Hvis du også vil have poster med NULL-værdier, skal du ændre denne betingelse til:
WHERE ( H.STATUS='COMPLETED' OR H.STATUS IS NULL )
du kan også fjerne denne betingelse fra WHERE-sætningen og tilføje den til ON-tilstanden for LEFT JOIN, dvs.:
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' )
se den sidste forespørgsel i denne demo:http://sqlfiddle.com/#!9/e2ed0 /3