Když se JOIN
dvě nebo více tabulek dohromady, efektivně získáte kartézský součin pro tyto tabulky, ke kterému je filtr uvedený v JOIN
je použita podmínka.
To je jasnější, když použijete zastaralý implicitní JOIN
syntaxe.
LEFT JOIN
zaručuje, že nedostanete nic méně řádků, než obsahuje tabulka zcela vlevo, tj. E. každý řádek z tabulky zcela vlevo je vrácen alespoň jednou.
Stále můžete získat více řádků, pokud filtr není mapování řádků jeden na jeden.
Ve vašem případě:
SELECT (b.descr || ' - ' || c.descr) description
FROM tbl1 a
LEFT JOIN
tbl2 b
ON b.ACCOUNT = a.ACCOUNT
LEFT JOIN
tbl3 c
ON c.product = a.product
WHERE a.descr50 = ' '
buď acccount
nebo product
nejsou jedinečné v b
nebo c
.
Pro tyto řádky:
a.account
1
2
3
b.account b.description
1 Account 1
2 Account 2 - old
2 Account 2 - new
, JOIN
vrátí následující:
a.account b.account b.description
1 1 Account 1
2 2 Account 2 - old
2 2 Account 2 - new
3 NULL NULL
, čímž získáte více řádků, než obsahuje kterákoli z tabulek.
Chcete-li pouze vybrat první odpovídající popis z kterékoli tabulky, použijte toto:
SELECT (
SELECT FIRST_VALUE(descr) OVER (ORDER BY descr)
FROM tbl2 b
WHERE b.account = a.account
AND rownum = 1
) || ' - ' ||
(
SELECT FIRST_VALUE(descr) OVER (ORDER BY descr)
FROM tbl3 c
WHERE c.product= a.product
AND rownum = 1
) description
FROM tbl1 a
WHERE a.descr50 = ' '
Chcete-li aktualizovat, stačí zabalit dotaz do vloženého zobrazení:
UPDATE (
SELECT (
SELECT FIRST_VALUE(descr) OVER (ORDER BY descr)
FROM tbl2 b
WHERE b.account = a.account
AND rownum = 1
) || ' - ' ||
(
SELECT FIRST_VALUE(descr) OVER (ORDER BY descr)
FROM tbl3 c
WHERE c.product= a.product
AND rownum = 1
) description
FROM tbl1 a
WHERE a.descr50 = ' '
)
SET descr50 = description