sql >> Database teknologi >  >> RDS >> Oracle

Oracle- Venstre ydre joinforbindelse på flere tabeller returnerer ikke ønskede null-værdier

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




  1. Liste over alle fremmednøgler PostgreSQL

  2. PHP MySQL Triggere - Hvordan sender man variabler til trigger?

  3. Hvordan forvandler man 2 forespørgsler med fælles kolonner (A, B) og (A, C) til kun én (A, B, C)?

  4. ResultSet.next kun meget langsomt, når forespørgslen indeholder FIRST_ROWS eller ROWNUM begrænsning