Sql server 如何消除重复的子查询?

Sql server 如何消除重复的子查询?,sql-server,tsql,Sql Server,Tsql,如何消除重复的子查询 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

如何消除重复的子查询

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
您可以使用SQL Server更新。。。从语法来看,例如:

UPDATE  t1
SET     SDVR03 = 1
FROM    TESTDTA.F4211 t1
JOIN    TESTDTA.F4102 t2
ON      IBLITM = SDLITM and IBMCU = SDMCU
WHERE   ...
您可以使用SQL Server更新。。。从语法来看,例如:

UPDATE  t1
SET     SDVR03 = 1
FROM    TESTDTA.F4211 t1
JOIN    TESTDTA.F4102 t2
ON      IBLITM = SDLITM and IBMCU = SDMCU
WHERE   ...

很简单,将其从CASE子句中删除,并直接放入WHERE子句中。如果不为true,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))
    )

很简单,将其从CASE子句中删除,并直接放入WHERE子句中。如果不为true,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))
    )

我无法获得正确的查询格式。我现在发布了它。这应该会起作用:当SDPDDJ-从TESTDTA.F4102中选择IBOPV,其中IBLITM=SDLITM和IBMCU=SDMCU>=@Today_JD和@DayOfWeek=2和SDVEND=1010或SDVEND=4010或@DayOfWeek=3和SDVEND=110051或SDVEND=110052或SDVEND=2010或@DayOfWeek=4和SDVEND=50001或@DayOfWeek=5和SDVEND=110034,然后是1 Thanks@user624128:SDVEND在1010、4010中似乎比SDVEND=1010或SDVEND=4010更方便。@user624128-您不应该将CASE语句用于如此琐碎的事情,因为我无法正确获取查询格式。我现在发布了它。这应该会起作用:当SDPDDJ-从TESTDTA.F4102中选择IBOPV,其中IBLITM=SDLITM和IBMCU=SDMCU>=@Today_JD和@DayOfWeek=2和SDVEND=1010或SDVEND=4010或@DayOfWeek=3和SDVEND=110051或SDVEND=110052或SDVEND=2010或@DayOfWeek=4和SDVEND=50001或@DayOfWeek=5和SDVEND=110034,然后是1 Thanks@user624128:SDVEND在1010、4010中似乎比SDVEND=1010或SDVEND=4010更方便。@user624128-你不应该对如此琐碎的事情使用CASE语句。我清理了CASE语句。现在看起来很整洁。谢谢你的帮助,我整理了案情陈述。现在看起来很整洁。谢谢你的帮助。