-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 ステートメントに変換できることですが、両方の結合の 2 番目の IN ステートメントは、同じフィルター処理が行われるため、少し混乱します。クエリの終わり。

それらが実際に冗長であるか、またはそれらが削除された場合に結果セットが異なる可能性があるかどうか疑問に思っていますか?

4

2 に答える 2

0

はい、IN (SELECT id FROM daytable WHERE dayTable.DateFrom > @dateFrom AND dayTable.DateTo < @dateTo)-partsは冗長です。これは、同じ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

リクエストのもう1つのオプションの最適化

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 に答える