【问题标题】:SQL Server Conditional CASE JOIN querySQL Server 条件 CASE JOIN 查询
【发布时间】:2018-11-29 10:13:12
【问题描述】:

有人可以帮我解决条件加入吗? 我想从两个表中加入 ID 和 [Name],下一个条件就像

当 a.Count = b.Count THEN a.Rn1 = b.Rn1 WHEN a.Count b.Count THEN a.Rn2 = b.Rn2 and 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

提前感谢您的帮助。

【问题讨论】:

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


    【解决方案1】:

    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)
    

    【讨论】:

    • 感谢您的建议,我将尝试在我的代码中实现。
    【解决方案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 中 WHERE 中的 CASE 必须是布尔表达式 ({CASE expression} {=|!=|&gt;|&lt;|etc} {Expression}) 的一部分,而不是返回一个。

    但是,在WHERE 子句中使用CASE 表达式会使您的查询不可搜索,最好纠正一些布尔逻辑。你所拥有的可能是:

    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);
    

    【讨论】:

    • 他实际上是在尝试对两个表进行连接,所以逻辑应该在“ON”部分进行。虽然我认为他的加入逻辑是错误的。
    • @MEdwin,你说得对,我正在尝试在 Join 子句上创建相同的逻辑
    【解决方案3】:

    可以用 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) 
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-03-04
      • 2014-09-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多