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

Transact-SQL: Join two tables with optional join-attributes in Table 2

我在为以下情况定义 Transact-SQL (SQL Server) 语句时遇到问题: 有2个Table1和2,每个都有一个ID(主键)和3个属性A,B,C。 在 Table 1 中所有属性都是强制性的,在 Table 2 中只有 A 是强制性的。

这意味着在 Table 2 中或多或少是特定的记录。

我想做的是通过为Table 1

的记录找到最具体的Table 2的记录来连接这两个表

我希望下面的图片是一个可以理解的问题描述:

我试过在 case 语句后加入连接,但总是出现语法错误。

具体问题: 我的第一种方法是像这样用 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 

所以我只需要一个方法,而不是一个完整的解决方案。

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

然后使用 window 函数 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;

您可以在 rextester here

上测试 SQL