2017-03-22 14 views
1
select * 
from table1 t1, 
    table2 t2, 
    table3 t3 
where t2.parent_id = t1.row_id 
    and t2.xyz is not null 
    and (
     select count(*) 
     from table3 
     where xyz = t2.row_id 
     ) = 0; 

これは動作しますか? サブクエリ内で別名t2を使用しています。WHERE句でカウントを指定する

私の要件は、table3の列xyzがtable2のrow_idとして格納されているレコードがtable3に存在しないようにwhere句の条件を指定することです。

+0

使用しているSQLのバージョンは何ですか?これは自分で試しましたか?私は、カウントサブクエリの代わりに '存在しない'を使うかもしれません。現在、 'table2'と' table3'のクロスジョインをしていることに注意してください。 –

+0

Stack Exchangeサブサイトのコードレビュー – Edward

+0

今日のヒント:現代的で明示的な 'JOIN'構文に切り替えることができます! (以下の@ GurVの答えのように)。 – jarlh

答えて

2

NOT EXISTSを使用すると、サブクエリから返された行がないことをアサートできます。コンマベースの従来の構文ではなく、現代的な明示的な結合構文を使用します。外にtable3に参加する必要はありません(あなたは効果的にクロス結合を行っていました)。

select * 
from table1 t1 
join table2 t2 on t2.parent_id = t1.row_id 
where t2.xyz is not null 
    and not exists (
     select 1 
     from table3 
     where xyz = t2.row_id 
     );