SQL Server Conditional CASE JOIN query



有人能帮我处理条件联接吗?我想加入两个表中的ID和[Name],下一个条件就像

当a.计数=b.然后计数a.Rn1=b.Rn1当a.计数<>b.计数THEN a.Rn2=b.Rn2和a.Rn3=b.Rn3结束

DROP TABLE IF EXISTS #Test1
DROP TABLE IF EXISTS #Test2
CREATE TABLE #Test1 (ID int, [name] varchar(50),[Count] int, Rn1 int, Rn2 int, Rn3 int)
CREATE TABLE #Test2 (ID int, [name] varchar(50),[Count] int, Rn1 int, Rn2 int, Rn3 int)
Insert Into #Test1 
Values 
(123123,'Hours',6,1,1,1)
,(123123,'Hours',6,2,1,2)
,(123123,'Hours',6,3,2,1)
,(123123,'Hours',6,4,3,1)
,(123123,'Hours',6,5,3,2)
,(123123,'Hours',6,6,4,1)
,(123123,'NI1',1,1,1,1)
,(123123,'NI2',1,1,1,1)
,(123123,'PAY',1,1,1,1)
,(123123,'Teachers1',1,1,1,1)
,(123123,'Teachers2',1,1,1,1)
,(123124,N'Hours',5,1,1,1)
,(123124,N'Hours',5,2,2,1)
,(123124,N'Hours',5,3,3,1)
,(123124,N'Hours',5,4,3,2)
,(123124,N'Hours',5,5,4,1)
,(123124,N'NI1',1,1,1,1)
,(123124,N'NI2',1,1,1,1)
,(123124,N'PAY',1,1,1,1)
--SELECT * FROM #Test1 
Insert Into #Test2
Values (123123,N'Hours',6,1,1,1)
,(123123,N'Hours',6,2,1,2)
,(123123,N'Hours',6,3,2,1)
,(123123,N'Hours',6,4,3,1)
,(123123,N'Hours',6,5,3,2)
,(123123,N'Hours',6,6,4,1)
,(123123,N'NI1',1,1,1,1)
,(123123,N'NI2',1,1,1,1)
,(123123,N'PAY',1,1,1,1)
,(123123,N'Teachers1',1,1,1,1)
,(123123,N'Teachers2',1,1,1,1)
,(123124,N'Hours',6,1,1,1)
,(123124,N'Hours',6,2,2,1)
,(123124,N'Hours',6,3,3,1)
,(123124,N'Hours',6,4,3,2)
,(123124,N'Hours',6,5,3,3)
,(123124,N'Hours',6,6,4,1)
,(123124,N'NI1',1,1,1,1)
,(123124,N'NI2',1,1,1,1)
,(123124,N'PAY',1,1,1,1)
--SELECT * FROM #Test2

感谢您提前提供的帮助。

CASE表达式的谓词(即THENELSE后面的谓词(必须始终是一个值,而不是另一个逻辑表达式。在没有看到整个查询的情况下,我可以建议进行以下重构:

WHERE
(a.Count = b.Count AND a.Rn1 = b.Rn1) OR
(a.Count <> b.Count AND a.Rn2 = b.Rn2 AND a.Rn3 = b.Rn3)

您正试图像使用CASE语句一样使用CASE表达式。CASE表达式返回标量值,而不是布尔结果。因此,例如,以下语法是有效的:

WHERE CASE [Column] WHEN 'A' THEN 1 ELSE 2 END = OtherColumn;

这是因为CASE表达式返回标量值12。以下语句无效:

WHERE CASE [Column] WHEN 'A' THEN OtherColumn = 1 ELSE OtherColumn = 2 END;

T-SQL中WHERE中的CASE需要是布尔表达式({CASE expression} {=|!=|>|<|etc} {Expression}(的一部分,而不是返回一个。

然而,在WHERE子句中使用CASE表达式会使您的查询成为非SARGable查询,因此您最好纠正一些布尔逻辑。对于你所拥有的可能是:

WHERE (A.[Count] = b.[Count]
AND  A.RN1 = B.RN1)
OR (A.[Count] != b.[Count]
AND  A.RN2 = B.RN2
AND  A.RN3 = B.RN3);

可以对CASE表达式执行类似操作:

WHERE 1 = (CASE WHEN a.Count = b.Count THEN  CASE WHEN a.Rn1 = b.Rn1 THEN 1 END 
WHEN a.Count <> b.Count THEN CASE WHEN a.Rn2 = b.Rn2 and a.Rn3 = b.Rn3 THEN 1 END
END) 

这是对原始请求的直译,没有任何优化。

最新更新