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

0

把它放在一个子查询中。子查询将首先过滤它,然后外部查询将进行比较。

SELECT distinct * 
FROM LETTRE_VOIT_TEMP where NOT EXISTS
(
    SELECT *
    FROM (
       SELECT *
        FROM LETTRE_VOIT_FINAL 
       WHERE lv.DATE_CLOTUR_REEL = @DATE_CLOTUR_REEL
       ) 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())
  ) 
于 2013-07-24T14:42:26.893 回答