在以下情况下,我很难定义Transact-SQL(SQL Server)语句: 有2个表1和2,每个表都有一个ID(主键)和3个属性A,B,C。 在表1中,所有属性都是必需的,在表2中,只有A是必需的。
这意味着表2中或多或少是特定记录。
我要做的是通过为表1的记录找到表2的最具体记录来将这两个表连接起来
我曾尝试用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
因此,我只需要一种方法,而不是一个完整的解决方案。
答案 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