有人能帮我处理条件联接吗?我想加入两个表中的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
表达式的谓词(即THEN
和ELSE
后面的谓词(必须始终是一个值,而不是另一个逻辑表达式。在没有看到整个查询的情况下,我可以建议进行以下重构:
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
表达式返回标量值1
或2
。以下语句无效:
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)
这是对原始请求的直译,没有任何优化。