私がSQLを書く場合:
select *
from a,b
where a.id=b.id(+)
and b.val="test"
そして、b の対応するレコードが存在しないか、val="test" で存在する a からのすべてのレコードが必要ですが、これは正しいクエリですか?
私が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 ...
LEFT OUTER JOIN は、結合句を指定できる JOIN 操作の 1 つです。最初 (左) のテーブルの一致しない行を保持し、それらを 2 番目 (右) のテーブルの形で NULL 行と結合します。
したがって、次のようにできます。
SELECT
FROM a LEFT OUTER JOIN b ON a.id = b.id
-- SQL の varchar には使用されない二重引用符 "test" を使用していることに注意してください。単一引用符 'test' を使用する必要があります。
AND b.val = 'テスト';
SELECT * FROM abc a, xyz b
WHERE a.id = b.id
AND b.val = 'test'