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:

  • 编号:整数

表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));

我不希望这两者之间的性能有太大差异。该查询可能会受益于 Table2.Id 上的索引(您在 Table3.Id 上有一个索引,因为它是主键)。

于 2013-07-16T00:06:05.580 回答
0

in将子查询从子句移动到子句有两个关键部分from。第一个是使用left outer join,因此第一个表中的行不会无意中丢失。第二个是select distinct用于每个子查询,以避免不必要的重复。

应用于您的查询,结果是:

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 回答