-1

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

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

我要做的是通过为表1的记录找到表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 

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

4

1 回答 1

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;

您可以在此处测试 rextester 上的 SQL

于 2018-09-18T11:38:34.100 回答