Как я могу устранить дубликаты подзапросов? - PullRequest
1 голос
/ 19 февраля 2011

Как удалить дубликаты подзапросов?

SDPDDJ - (SELECT IBOPV FROM TESTDTA.F4102 WHERE IBLITM = SDLITM and IBMCU = SDMCU )

из следующего запроса:

Declare @OPV int
Declare @Today_JD int
Declare @DayOfWeek int
SET  @Today_JD =  dbo.date2jde (convert(varchar(10),getdate(),111)) --today in Julian   
SET  @DayOfWeek = DATEPART(dw, dbo.jde2date(@Today_JD))    -- Day of week (1 to 7)

UPDATE TESTDTA.F4211  SET SDVR03 = 1
FROM TESTDTA.F4211

WHERE sdkcoo = 30001 and sdsrp1 = 'ITO' and sdsobk > 0 and  sdvend > '' and 
      sddoco = 2606544 and sdlnid = 27000 and 

    CASE 
        WHEN ((SDPDDJ - (SELECT IBOPV FROM TESTDTA.F4102 WHERE IBLITM = SDLITM and IBMCU = SDMCU ) >= @Today_JD) AND (@DayOfWeek = 2) and (SDVEND= 1010 OR SDVEND=4010)) THEN 1
            WHEN ((SDPDDJ - (SELECT IBOPV FROM TESTDTA.F4102 WHERE IBLITM = SDLITM and IBMCU = SDMCU ) >= @Today_JD) AND (@DayOfWeek = 3) and (SDVEND= 110051 OR SDVEND=110052 OR SDVEND = 2010)) THEN 1            
            WHEN ((SDPDDJ - (SELECT IBOPV FROM TESTDTA.F4102 WHERE IBLITM = SDLITM and IBMCU = SDMCU ) >= @Today_JD) AND (@DayOfWeek = 4) and (SDVEND= 50001))   THEN 1
            WHEN ((SDPDDJ - (SELECT IBOPV FROM TESTDTA.F4102 WHERE IBLITM = SDLITM and IBMCU = SDMCU ) >= @Today_JD) AND (@DayOfWeek = 5) and (SDVEND= 110034))  THEN 1    
        ELSE 0      
    END  = 1

Ответы [ 2 ]

1 голос
/ 19 февраля 2011

Просто, удалите его из предложений CASE и вставьте непосредственно в предложение WHERE.Если это не так, ВСЕ ветки оператора CASE переходят в FALSE ->, в результате получается CASE ELSE -> 0, который в конце не будет соответствовать = 1.Так что просто возьмите это за пределы кейса.

Declare @OPV int
Declare @Today_JD int
Declare @DayOfWeek int
SET  @Today_JD =  dbo.date2jde (convert(varchar(10),getdate(),111)) --today in Julian   
SET  @DayOfWeek = DATEPART(dw, dbo.jde2date(@Today_JD))    -- Day of week (1 to 7)

UPDATE TESTDTA.F4211  SET SDVR03 = 1
FROM TESTDTA.F4211
WHERE sdkcoo = 30001 and sdsrp1 = 'ITO' and sdsobk > 0 and  sdvend > '' and 
      sddoco = 2606544 and sdlnid = 27000 and 
      (SDPDDJ - (SELECT IBOPV FROM TESTDTA.F4102 WHERE IBLITM = SDLITM and IBMCU = SDMCU ) >= @Today_JD)
AND
    CASE 
        WHEN (@DayOfWeek = 2) and SDVEND IN (1010,4010) THEN 1
        WHEN (@DayOfWeek = 3) and SDVEND IN (110051,110052,2010) THEN 1            
        WHEN (@DayOfWeek = 4) and SDVEND= 50001)   THEN 1
        WHEN (@DayOfWeek = 5) and SDVEND= 110034)  THEN 1    
        ELSE 0      
    END  = 1

Я бы пошел дальше и полностью отбросил бы кейс с оператором

Declare @OPV int
Declare @Today_JD int
Declare @DayOfWeek int
SET  @Today_JD =  dbo.date2jde (convert(varchar(10),getdate(),111)) --today in Julian   
SET  @DayOfWeek = DATEPART(dw, dbo.jde2date(@Today_JD))    -- Day of week (1 to 7)

UPDATE TESTDTA.F4211  SET SDVR03 = 1
FROM TESTDTA.F4211
WHERE sdkcoo = 30001 and sdsrp1 = 'ITO' and sdsobk > 0 and  sdvend > '' and 
      sddoco = 2606544 and sdlnid = 27000 and 
      ((SDPDDJ - (SELECT IBOPV FROM TESTDTA.F4102 WHERE IBLITM = SDLITM and IBMCU = SDMCU ) >= @Today_JD)
AND (
    ((@DayOfWeek = 2) and SDVEND IN (1010,4010)) OR
    ((@DayOfWeek = 3) and SDVEND IN (110051,110052,2010)) OR
    ((@DayOfWeek = 4) and (SDVEND= 50001)) OR
    ((@DayOfWeek = 5) and (SDVEND= 110034))
    )
0 голосов
/ 19 февраля 2011

Вы можете использовать синтаксис SQL Server update ... from, например:

UPDATE  t1
SET     SDVR03 = 1
FROM    TESTDTA.F4211 t1
JOIN    TESTDTA.F4102 t2
ON      IBLITM = SDLITM and IBMCU = SDMCU
WHERE   ...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...