2009-08-14 20 views

答えて

10

は、あなたが一緒にexistsに使用される2つの列を一致させる必要があります。

select 
    t1.a, t1.b 
from 
    table1 t1 
where 
    exists (select 1 from table2 t2 where t2.c = t1.a) 

existsは、したがって、テーブルの上に半結合、およびを実行するので、あなたがすることをしなければならない理由は、あります結合条件が必要です。

4

これは直接内部結合によって行います。表現の変更

select 
    t1.a, t1.b 
from 
    table1 as t1 
     inner join table2 as t2 on t1.a=t2.c 
+0

時にはこれは速く、時にはそうではありません。 'table2'が' table1'よりもかなり小さい場合は、 'exists'を実行する方がはるかに高速です。決定的な結果を得るための実行計画を入手してください。 – Eric

+0

@エリック: "スマート" SQLサーバがプランよりも機能するよりも、SQLの最適化が制限されている場合(例えばsqliteの場合)、INがあると最適化が単にオフになる可能性が高くなります。 、EXISTSなど。Prabicは彼が使用している特定のサーバにタグをつけなかった。 – dmajkic

0

EXISTS

FROM Table1 WHERE a IN(SELECT c FROM Table2) 

は、の単純な問題である:

  1. 内部SELECT

    FROM Table1 WHERE a IN(SELECT c FROM Table2 WHERE) 
    
  2. の端に WHEREを追加
  3. 内部SELECTWHERE

    FROM Table1 WHERE IN(SELECT c FROM Table2 WHERE a) 
    
  4. に外部の一致列(A)を移動列のプレースホルダ(定数または*)を残し、WHERE句内部一致列(B)を移動:

    FROM Table1 WHERE IN(SELECT * FROM Table2 WHERE a = c) 
    
  5. 変更INEXISTSへ:

    FROM Table1 WHERE EXISTS(SELECT * FROM Table2 WHERE a = c) 
    
  6. 内部カラムにテーブル名を追加し、安全であると
  7. FROM Table1 WHERE EXISTS(SELECT * FROM Table2 WHERE a = Table1.c) 
    
+0

あなたのコードフォーマットを修正;) – LukeH

+0

ありがとうございました。もし私がそれを理解することができたら、夢中になる... – RBarryYoung

+0

THANX EVERY ONE –

関連する問題