-1

我收到了这样的查询

SELECT * FROM dayTable
LEFT JOIN ProcessTable firstprocess
ON dayTable.id = a.daytablefkid 
AND firstprocess.processid in (1234)
AND firstprocess.daytablefkid 
     IN (SELECT id 
         FROM daytable  
         WHERE dayTable.DateFrom > @dateFrom 
         AND dayTable.DateTo < @dateTo)

LEFT JOIN ProcessTable secondprocess
ON daytable.id = secondprocess.daytablefkid
and secondprocess.processid in (4567)
    IN (SELECT id 
        FROM daytable 
        WHERE dayTable.DateFrom > @dateFrom 
        AND dayTable.DateTo < @dateTo)


WHERE dayTable.DateFrom > @dateFrom AND dayTable.DateTo < @dateTo

我注意到的第一件事是连接中的第一个 IN 语句“IN(XXXX)”可以转换为 WHERE 语句,但是两个连接中的第二个 IN 语句有点令人困惑,因为相同的过滤也在查询结束。

我想知道它们是否确实是多余的,或者如果它们被删除,结果集是否会有所不同?

4

2 回答 2

0

是的,IN (SELECT id FROM daytable WHERE dayTable.DateFrom > @dateFrom AND dayTable.DateTo < @dateTo)-parts 是多余的,因为你已经加入了 daytable,你有相同的WHERE-clause。

此查询应给出相同的结果:

SELECT * 
FROM dayTable
LEFT JOIN ProcessTable firstprocess
  ON dayTable.id = firstprocess.daytablefkid 
    AND firstprocess.processid = 1234
LEFT JOIN ProcessTable secondprocess
  ON daytable.id = secondprocess.daytablefkid
    AND secondprocess.processid = 4567
WHERE 
  dayTable.DateFrom > @dateFrom 
  AND dayTable.DateTo < @dateTo
于 2013-01-18T07:25:35.413 回答
0

请求的又一个选项优化

SELECT * 
FROM dayTable 
  LEFT JOIN ProcessTable process ON dayTable.id = process.daytablefkid 
    AND process.processid IN (1234, 4567)
WHERE dayTable.DateFrom > @dateFrom AND dayTable.DateTo < @dateTo
于 2013-01-20T15:24:05.937 回答