JOIN
するとき 2つ以上のテーブルを一緒に使用すると、JOIN
でフィルターが指定されたこれらのテーブルのデカルト積を効果的に取得できます。 条件が適用されます。
これは、廃止された暗黙のJOIN
を使用する場合により明白になります。 構文。
LEFT JOIN
少ないがないことを保証します 左端のテーブルに含まれる行よりも、i。 e。左端のテーブルの各行が少なくとも1回返されます。
フィルタが1対1の行マッピングでない場合でも、さらに多くの行を取得できます。
あなたの場合:
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