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语句。现在看起来很整洁。谢谢你的帮助,我整理了案情陈述。现在看起来很整洁。谢谢你的帮助。