9

私がSQLを書く場合:

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

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

4

4 に答える 4

20

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

于 2013-08-22T21:01:04.027 に答える
1

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

SELECT NameYourFields,...
FROM A
LEFT OUTER JOIN B
ON A.ID = B.ID
AND B.VAL = 'test'
INNER JOIN C
ON ...
于 2013-08-22T21:00:29.767 に答える
0

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 = 'テスト';

于 2013-08-22T21:14:16.160 に答える
-1
SELECT * FROM abc a, xyz b
 WHERE a.id = b.id
   AND b.val = 'test'
于 2016-08-03T13:28:45.670 に答える