私がSQLを書く場合:
select *
from a,b
where a.id=b.id(+)
and b.val="test"
そして、bの対応するレコードが存在しないか、val = "test"で存在する、aからのすべてのレコードが必要です。これは正しいクエリですか?
ANSI構文を使用する方がはるかに優れています
SELECT *
FROM a
LEFT OUTER JOIN b ON( a.id = b.id and
b.val = 'test' )
Oracleの構文を使用して同じことを行うこともできますが、少し厄介です。
SELECT *
FROM a,
b
WHERE a.id = b.id(+)
AND b.val(+) = 'test'
どちらの場合も、結合条件を指定していないため、c
テーブルを無視していることに注意してください。そして、AからBに結合してから、Cを使用してデカルト積を生成したくないと想定しています。
条件をJOIN
句に移動し、ANSI標準の結合パターンを使用します。
SELECT NameYourFields,...
FROM A
LEFT OUTER JOIN B
ON A.ID = B.ID
AND B.VAL = 'test'
INNER JOIN C
ON ...
SELECT * FROM abc a, xyz b
WHERE a.id = b.id
AND b.val = 'test'
LEFT OUTER JOINは、結合句を指定できるJOIN操作の1つです。最初の(左)テーブルの一致しない行を保持し、2番目(右)のテーブルの形でNULL行と結合します。
したがって、次のように実行できます。
選択する
左外部結合bからa.id = b.id
--SQLのvarcharには使用されない二重引用符「test」を使用していることに注意してください。一重引用符「test」を使用する必要があります。
AND b.val = 'テスト';