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
我在为以下情况定义 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