Saat Anda JOIN
dua atau lebih tabel bersama-sama, Anda secara efektif mendapatkan produk kartesius untuk tabel ini yang filternya dinyatakan dalam JOIN
kondisi diterapkan.
Ini lebih jelas ketika Anda menggunakan JOIN
implisit yang sudah usang sintaks.
LEFT JOIN
menjamin bahwa Anda tidak akan mendapatkan kurang baris dari tabel paling kiri berisi, i. e. setiap baris dari tabel paling kiri dikembalikan setidaknya satu kali.
Anda masih bisa mendapatkan lebih banyak baris, jika filternya bukan pemetaan baris satu-ke-satu.
Dalam kasus Anda:
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 = ' '
baik acccount
atau product
tidak unik dalam b
atau c
.
Untuk baris ini:
a.account
1
2
3
b.account b.description
1 Account 1
2 Account 2 - old
2 Account 2 - new
, JOIN
akan mengembalikan berikut ini:
a.account b.account b.description
1 1 Account 1
2 2 Account 2 - old
2 2 Account 2 - new
3 NULL NULL
, memberi Anda lebih banyak baris daripada isi tabel mana pun.
Untuk memilih deskripsi pertama yang cocok dari salah satu tabel, gunakan ini:
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 = ' '
Untuk memperbarui, cukup bungkus kueri menjadi tampilan sebaris:
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