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

Oracle (+) vnější spojení a konstantní hodnoty

Vysvětlím to pomocí ekvivalentní syntaxe "ANSI JOIN":

Možnost 1

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

Možnost 2

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

Jak vidíte, u možnosti 1 se vaše konstantní predikáty použijí po LEFT JOIN je zadán tabulkový výraz, tj. na výsledku LEFT JOIN .

Ve volbě 2 je jeden z vašich konstantních predikátů součástí LEFT JOIN výraz.

Jak LEFT JOIN práce?

Myšlenka LEFT JOIN je, že vrátí všechny řádky z LEVA straně JOIN výraz, bez ohledu na to, zda je na druhé straně odpovídající řádek, daný predikátem spojení. Takže v možnosti 2, bez ohledu na to, jestli najdete řádek v CHK s CURRENT = 'Y' pro řádek v TXN , řádek v TXN se stále vrací. To je důvod, proč získáte více řádků v možnosti 2.

Tento příklad by měl také vysvětlit, proč byste měli preferovat syntaxi "ANSI JOIN". Z hlediska údržby/čitelnosti je mnohem jasnější, co váš dotaz dělá.



  1. Přepnutí oddílu na SQL Server (T-SQL)

  2. Jak napsat parametrizovaný dotaz SQL, aby se zabránilo vkládání SQL?

  3. Zkombinujte 2 dotazy SELECT LEFT JOIN, spojení/deklarování AS nefunguje

  4. Nelze získat výsledky předáním vstupu jako xml cestu v oracle