sql >> Databasteknik >  >> RDS >> Oracle

Oracle (+) yttre koppling och konstanta värden

Jag ska förklara detta genom att använda motsvarande "ANSI JOIN"-syntax:

Alternativ 1

SELECT *
FROM TXN
LEFT JOIN CHK 
  ON TXN.CHK_ID = CHK.CHK_ID
WHERE TXN.CURRENT = 'Y'
AND CHK.CURRENT = 'Y'

Alternativ 2

SELECT *
FROM TXN
LEFT JOIN CHK 
  ON TXN.CHK_ID = CHK.CHK_ID 
  AND CHK.CURRENT = 'Y'
WHERE TXN.CURRENT = 'Y'

Som du kan se, i alternativ 1, tillämpas dina konstanta predikat efter LEFT JOIN tabelluttryck specificeras, d.v.s. på resultatet av LEFT JOIN .

I alternativ 2 är ett av dina konstanta predikat en del av LEFT JOIN uttryck.

Hur går LEFT JOIN jobba?

Idén med en LEFT JOIN är att det kommer att returnera alla rader från VÄNSTER sidan av JOIN uttryck, oavsett om det finns en matchande rad på andra sidan, givet join-predikatet. Så, i alternativ 2, oavsett om du hittar en rad i CHK med CURRENT = 'Y' för en rad i TXN , raden i TXN är fortfarande tillbaka. Det är därför du får fler rader i alternativ 2.

Detta exempel bör också förklara varför du bör föredra syntaxen "ANSI JOIN". Ur ett underhålls-/läsbarhetsperspektiv är det mycket tydligare vad din fråga gör.



  1. PostgreSQL:hur man installerar plpythonu-tillägget

  2. hur sparar man taggar (sökord) i databasen?

  3. SELECTING med flera WHERE-villkor i samma kolumn

  4. Hur hämtar jag alla rekursiva underordnade underordnade raden i Oracle SQL?