0

SELECT ... WHERE SELECT ...それは遅いので、代わりに結合を使用する必要があることを読みました。

しかし、このコードを置き換える方法がわかりません

SELECT Id
FROM Table1
Where
    (
        Data1 IS NULL
        OR
        (
            Data2=1
            AND
            (SELECT 1 FROM Table2 WHERE Table2.Id=Table1.Id) IS NULL
        )
    )
    AND
    (SELECT 1 FROM Table3 WHERE Table3.Id=Table1.Id) IS NULL

ジョイン付き。

テーブルの構造は次のとおりです。

表1:

  • Id: 整数の主キー
  • データ 1: XML
  • データ 2: 整数

表 2:

  • ID: 整数

表 3:

  • Id: 整数の主キー
4

2 に答える 2

1
select Id from Table1 where
  Id not in (select Id from Table3) and
  (Data1 is null or 
   (Data2 = 1 and Id not in (select Id from Table2)));

または、本当に結合が必要な場合:

select Id from Table1 left join Table2 on (Table1.Id = Table2.Id)
  left join Table3 on (Table1.Id = Table3.Id)
where Table3.Id is null and
  (Data1 is null or
   (Data2 = 1 and Table2.Id is null));

この 2 つのパフォーマンスに大きな違いはないと思います。クエリは、Table2.Id のインデックスの恩恵を受ける可能性があります (主キーであるため、Table3.Id にインデックスがあります)。

于 2013-07-16T00:06:05.580 に答える
0

サブクエリを節に移動するには、2 つの重要な部分がありinますfrom。1 つ目は を使用するleft outer joinため、最初のテーブルの行が誤ってドロップアウトすることはありません。select distinct2 つ目は、不要な重複を避けるために、サブクエリごとに使用することです。

クエリに適用すると、結果は次のようになります。

SELECT t1.Id
FROM Table1 t1 left outer join
     (select distinct id
      from Table2
     ) t2
     on t1.id = t2.id left outer join
     (select distinct id
      from Table3
     ) t3
     on t1.id = t3.id
Where(t1.Data1 IS NULL OR
      (t1.Data2=1 and t2.id is null)
     ) and
     t3.id is null;
于 2013-07-15T16:11:18.227 に答える