Khi bạn JOIN
hai hoặc nhiều bảng cùng nhau, bạn sẽ có được một sản phẩm cacte hiệu quả cho các bảng này mà bộ lọc được nêu trong JOIN
điều kiện được áp dụng.
Điều này rõ ràng hơn khi bạn sử dụng JOIN
ngầm định đã lỗi thời cú pháp.
LEFT JOIN
đảm bảo rằng bạn nhận được không ít hơn hàng hơn bảng ngoài cùng bên trái chứa, i. e. mỗi hàng từ bảng ngoài cùng bên trái được trả về ít nhất một lần.
Bạn vẫn có thể nhận được nhiều hàng hơn, nếu bộ lọc không phải là ánh xạ một hàng một.
Trong trường hợp của bạn:
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
hoặc product
không phải là duy nhất trong b
hoặc c
.
Đối với các hàng này:
a.account
1
2
3
b.account b.description
1 Account 1
2 Account 2 - old
2 Account 2 - new
, JOIN
sẽ trả về như sau:
a.account b.account b.description
1 1 Account 1
2 2 Account 2 - old
2 2 Account 2 - new
3 NULL NULL
, cung cấp cho bạn nhiều hàng hơn một trong hai bảng chứa.
Để chỉ chọn mô tả phù hợp đầu tiên từ một trong hai bảng, hãy sử dụng cái này:
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 = ' '
Để cập nhật, chỉ cần đưa truy vấn vào dạng xem nội tuyến:
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