2013-07-24 2 views
0

у меня есть SQL, как это:каскадных 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.

как я могу это сделать?

ответ

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()) 
) 
Смежные вопросы