Transact-SQL:使用表2中的可选联接属性联接两个表

时间:2018-09-18 09:49:16

标签: sql-server join case exists

在以下情况下,我很难定义Transact-SQL(SQL Server)语句: 有2个表1和2,每个表都有一个ID(主键)和3个属性A,B,C。 在表1中,所有属性都是必需的,在表2中,只有A是必需的。

这意味着表2中或多或少是特定记录。

我要做的是通过为表1的记录找到表2的最具体记录来将这两个表连接起来

enter image description here 我希望下面的图片是对该问题的可以理解的描述:

我曾尝试用case语句跟随Joins,但始终会出现语法错误。

要指定问题: 我的第一种方法是像这样用ON Case定义联接表达式,当然不行,但是:

  SELECT * FROM Table T1
     JOIN Table T2 ON CASE
        WHEN T1.A = T2.A AND T1.B=T2.B AND T1.C=T2.C
        THEN T1.A = T2.A AND T1.B=T2.B AND T1.C=T2.C
        WHEN T1.A = T2.A AND T1.B=T2.B AND T1.C!=T2.C
        THEN T1.A = T2.A AND T1.B=T2.B
        WHEN T1.A = T2.A AND T1.B!=T2.B AND T1.C!=T2.C
        THEN T1.A = T2.A
        ELSE 0 

因此,我只需要一种方法,而不是一个完整的解决方案。

1 个答案:

答案 0 :(得分:0)

您可以将表连接到相同的属性,同时将空值视为通配符。

然后使用窗口函数row_number获得每个Table1 ID的最佳匹配

SELECT ID1, ID2
FROM
(
    SELECT t1.ID AS ID1, t2.ID AS ID2
    , ROW_NUMBER() OVER (PARTITION BY t1.ID ORDER BY (IIF(t2.AttributeA IS NULL,0,1) + IIF(t2.AttributeB IS NULL,0,1) + IIF(t2.AttributeC IS NULL,0,1)) DESC, t2.AttributeA DESC, t2.AttributeB DESC, t2.AttributeC DESC) AS rn
    FROM Table1 AS t1
    LEFT JOIN Table2 AS t2
       ON ((t2.AttributeA = t1.AttributeA OR t2.AttributeA IS NULL) AND
           (t2.AttributeB = t1.AttributeB OR t2.AttributeB IS NULL) AND
           (t2.AttributeC = t1.AttributeC OR t2.AttributeC IS NULL))
) q
WHERE rn = 1
ORDER BY ID1;

您可以在季度here上测试SQL