SQL Server条件CASE JOIN查询

时间:2018-11-29 10:13:12

标签: sql-server tsql sql-server-2016

有人可以帮我加入条件加入吗? 我想加入两个表的ID和[名称],下一个条件是

  

a.Count = b.Count时的情况则a.Rn1 = b.Rn1时a.Count <>   b。计数THEn a.Rn2 = b.Rn2和a.Rn3 = b.Rn3 END

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

谢谢您的帮助。

3 个答案:

答案 0 :(得分:4)

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)

答案 1 :(得分:2)

您正尝试使用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中CASE中的WHERE必须是布尔表达式({CASE expression} {=|!=|>|<|etc} {Expression})的一部分,而不是返回一个。

但是,在CASE子句中使用WHERE表达式会使查询成为非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);

答案 2 :(得分:0)

使用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) 

这是原始请求的字面翻译,没有任何优化。