不存在带的级联SQL

不存在带的级联SQL,sql,select,cascade,Sql,Select,Cascade,我有这样一个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_TE

我有这样一个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_最终包含许多数据时,它会减慢请求的速度

所以我改变如下:

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,其中DATE_CLOTUR_REEL=@DATE_CLOTUR_REEL,然后与LETTRE_VOIT_TEMP进行比较


我该怎么做呢?

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

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())
  )