bugfix> sql > 投稿

このようなORACLE JOIN構文で存在クエリを作成すると、期待どおりに機能します。

Select * from TableA
where not exists (Select 1 from TableB where TableB.Id = TableA.TableBForeignKeyId)

ANSI JOIN構文として記述した場合、機能しません。

Select * from TableA
where not exists (Select 1 
                      from (TableA 
                            INNER JOIN TableB 
                            on TableA.TableBForeignKeyId = TableB.Id))

ANSI JOINバージョンでは、TableAは上位クエリTableAとは異なります。そのため、完全なクエリは行を返しません。

Not: There is only one row on TableA that has no reference on TableB. This query should return one row of TableA.

なぜANSI JOINはこのように動作するのですか?

回答 2 件
  • 最初のクエリで記述した構文は適切です。つまり、

    Select * from TableA
    where not exists (Select 1 from TableB where TableB.Id = TableA.TableBForeignKeyId)
    
    

    2番目のクエリでは、内部クエリのTableAは外部TableAを参照しないため、目的の結果が得られません。

    最初のクエリに満足できない理由

    クエリを記述する他の方法を探している場合は、次のクエリを使用できます。

    Select * from TableA
    where TableA.TableBForeignKeyId not in (Select TableB.Id 
                          from TableB )
    
    

    乾杯!!

  • 2つのクエリはまったく似ていません。

    最初は相関サブクエリです。ザ・ WHERE  条件は外部クエリを指します。

    2番目は非相関サブクエリです。外部クエリへの接続はありません。この場合、サブクエリは、外部クエリとは無関係に単一の値を返します。行が返されない場合、クエリ全体は行を返しません。 1つ以上の行を返す場合、全体的なクエリは複数の行を返します。

    どちらも有効で正しい構文です。必要なものを使用する必要があります。通常は相関サブクエリになります。

あなたの答え