【发布时间】:2019-08-03 08:11:01
【问题描述】:
我正在尝试创建一个 tSQL 查询,该查询能够将两个表连接到我需要的数据中。这两个表中的每一个都具有与其他表相同的一组 3 个外键(例如表 {x、y、z})。在 table1 上,外键是非空的,而 table2 所有三个键都是可以空的。
示例表架构:
表 1 [id, fk_x (non null), fk_y (non null), fk_z (non null), table1_data]
表 2 [id, fk_x (null), fk_y (null), fk_z (null), table2_data]
我需要将 table1 中的每一行与表 2 中与 table1 中的键最匹配的行连接起来。最佳匹配是指以下内容。
- table2 中的所有非空键必须与 table1 中的键匹配。
- table2 中的 Null 键与 table1 中的任何键值匹配。
- 包含最多匹配键的行获胜。
- 具有相同数量的匹配键的行将加权
fk_x > fk_y > fk_z所在的键以确定决胜局。
注意:table2 有一个唯一约束,保证表中仅存在 3 个键的 1 个组合。
示例
[Table1]
+----+-----+-----+-----+------+
| id |fk_x |fk_y |fk_z | data |
+-----------------------------+
| 1 | 9 | 3 | 11 | a |
+-----------------------------+
| 2 | 9 | 4 | 2 | b |
+-----------------------------+
| 3 | 7 | 5 | 2 | c |
+-----------------------------+
| 4 | 7 | 6 | 2 | d |
+----+-----+-----+-----+------+
[Table2]
+----+-----+-----+-----+------+
| id |fk_x |fk_y |fk_z | data |
+-----------------------------+
| 10 | null| null| null| A |
+-----------------------------+
| 20 | null| 5 | 2 | B |
+-----------------------------+
| 30 | 7 | 5 | null| C |
+-----------------------------+
| 40 | 7 | null| 2 | D |
+----+-----+-----+-----+------+
[Results]
+----+-----+-----+-----+------+
| id | t1_data | t2_data |
+-----------------------------+
| 1 | a | A |
+-----------------------------+
| 2 | b | A |
+-----------------------------+
| 3 | c | C |
+-----------------------------+
| 4 | d | D |
+----+-----+-----+-----+------+
我在尝试解决要求 3 和 4 时遇到了麻烦。如果有人可以为此提供任何提示或解决方案,我将不胜感激。
顺便说一句:我将在 SQL Server 2014 上运行查询。
【问题讨论】:
-
你能发布你正在尝试的查询吗?
标签: sql sql-server tsql