不存在带的级联SQL
我有这样一个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
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())
)