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