Kiedy JOIN dwie lub więcej tabel razem, w efekcie otrzymujesz produkt kartezjański dla tych tabel, do których filtr określony w JOIN warunek jest stosowany.
Jest to bardziej oczywiste, gdy używasz przestarzałego niejawnego JOIN składnia.
LEFT JOIN gwarantuje, że nie otrzymasz mniej wierszy, które zawiera skrajna lewa tabela, tj. mi. każdy wiersz z tabeli znajdującej się po lewej stronie jest zwracany co najmniej raz.
Nadal możesz uzyskać więcej wierszy, jeśli filtr nie jest mapowaniem jeden do jednego.
W Twoim przypadku:
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 = ' '
albo acccount lub product nie są unikalne w b lub c .
Dla tych wierszy:
a.account
1
2
3
b.account b.description
1 Account 1
2 Account 2 - old
2 Account 2 - new
, JOIN zwróci następujące informacje:
a.account b.account b.description
1 1 Account 1
2 2 Account 2 - old
2 2 Account 2 - new
3 NULL NULL
, co daje więcej wierszy niż zawiera którakolwiek z tabel.
Aby wybrać pierwszy pasujący opis z dowolnej tabeli, użyj tego:
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 = ' '
Aby zaktualizować, po prostu zapakuj zapytanie do widoku wbudowanego:
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