0

私はこのようなSQLを持っています:

SELECT distinct * 
FROM LETTRE_VOIT_TEMP where NOT EXISTS
(
    SELECT *
    FROM LETTRE_VOIT_FINAL lv
  where lv.NOID        = LETTRE_VOIT_TEMP.NOID 
  AND lv.CODE_DEST   = LETTRE_VOIT_TEMP.CODE_DEST 
  AND lv.CODE_CLIENT = LETTRE_VOIT_TEMP.CODE_CLIENT 
  AND (LETTRE_VOIT_TEMP.NO_ORDRE_CUMMUL  IS NULL OR lv.NO_ORDRE_CUMMUL = LETTRE_VOIT_TEMP.NO_ORDRE_CUMMUL) 
  AND (LETTRE_VOIT_TEMP.DATE_CLOTURE     IS NULL OR lv.DATE_CLOTURE     = LETTRE_VOIT_TEMP.DATE_CLOTURE)
  AND (LETTRE_VOIT_TEMP.DATE_CLOTUR_REEL IS NULL OR lv.DATE_CLOTUR_REEL =  LETTRE_VOIT_TEMP.DATE_CLOTUR_REEL)

) 

うまく機能しますが、問題は、テーブル LETTRE_VOIT_FINAL に多くのデータが含まれている場合、リクエストが遅くなることです。

だから私はこのように変更します:

SELECT distinct * 
FROM LETTRE_VOIT_TEMP where NOT EXISTS
(
    SELECT *
    FROM LETTRE_VOIT_FINAL lv
  where lv.NOID        = LETTRE_VOIT_TEMP.NOID 
  AND lv.CODE_DEST   = LETTRE_VOIT_TEMP.CODE_DEST 
  AND lv.CODE_CLIENT = LETTRE_VOIT_TEMP.CODE_CLIENT 
  AND (LETTRE_VOIT_TEMP.NO_ORDRE_CUMMUL  IS NULL OR lv.NO_ORDRE_CUMMUL = LETTRE_VOIT_TEMP.NO_ORDRE_CUMMUL) 
  AND (LETTRE_VOIT_TEMP.DATE_CLOTURE     IS NULL OR lv.DATE_CLOTURE     = LETTRE_VOIT_TEMP.DATE_CLOTURE)
  AND (LETTRE_VOIT_TEMP.DATE_CLOTUR_REEL IS NULL OR lv.DATE_CLOTUR_REEL =  LETTRE_VOIT_TEMP.DATE_CLOTUR_REEL)
  --AND lv.date_cloture between DATEADD(dd, -4, GETDATE()) and DATEADD(dd, +4, GETDATE())
  AND lv.DATE_CLOTUR_REEL = @DATE_CLOTUR_REEL
) 

期待どおりに動作しません。

最初にすべての LETTRE_VOIT_FINAL WHERE DATE_CLOTUR_REEL = @DATE_CLOTUR_REEL を選択してから、LETTRE_VOIT_TEMP と比較します。

どうやってやるの ?

4

1 に答える 1