web-dev-qa-db-ja.com

フィルタwhere句を使用したOracle外部結合の使用方法

私がSQLを書く場合:

select * 
from a,b 
where     a.id=b.id(+) 
      and b.val="test"

そして、bの対応するレコードが存在しないか、val = "test"で存在する、aからのすべてのレコードが必要です。これは正しいクエリですか?

8
Victor

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を使用してデカルト積を生成したくないと想定しています。

15
Justin Cave

条件をJOIN句に移動し、ANSI標準の結合パターンを使用します。

SELECT NameYourFields,...
FROM A
LEFT OUTER JOIN B
ON A.ID = B.ID
AND B.VAL = 'test'
INNER JOIN C
ON ...
1
Declan_K
SELECT * FROM abc a, xyz b
 WHERE a.id = b.id
   AND b.val = 'test'
1
santosh

LEFT OUTER JOINは、結合句を指定できるJOIN操作の1つです。最初の(左)テーブルの一致しない行を保持し、2番目(右)のテーブルの形でNULL行と結合します。

したがって、次のように実行できます。

選択する
左外部結合bからa.id = b.id

--SQLのvarcharには使用されない二重引用符「test」を使用していることに注意してください。一重引用符「test」を使用する必要があります。

AND b.val = 'テスト';

0
Gourabp