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