Когато JOIN
две или повече таблици заедно, вие ефективно получавате декартов продукт за тези таблици, към който филтърът е посочен в JOIN
се прилага условието.
Това е по-очевидно, когато използвате остаряло имплицитно JOIN
синтаксис.
LEFT JOIN
гарантира, че не получавате по-малко редове, отколкото съдържа най-лявата таблица, т.е. д. всеки ред от най-лявата таблица се връща поне веднъж.
Все още можете да получите повече редове, ако филтърът не е едно към едно съпоставяне на редове.
Във вашия случай:
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 = ' '
или acccount
или product
не са уникални в b
или c
.
За тези редове:
a.account
1
2
3
b.account b.description
1 Account 1
2 Account 2 - old
2 Account 2 - new
, JOIN
ще върне следното:
a.account b.account b.description
1 1 Account 1
2 2 Account 2 - old
2 2 Account 2 - new
3 NULL NULL
, което ви дава повече редове, отколкото всяка от таблиците съдържа.
За да изберете само първото съответстващо описание от която и да е таблица, използвайте това:
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 = ' '
За да актуализирате, просто увийте заявката във вграден изглед:
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