使用 SQL Server 2005 在 2 个表之间关联对

Associate couples between 2 tables with SQL Server 2005

问题很简单,答案很简单(对我来说)。

我有 2 个相同的表,由 2 列组成:ID 和值。我必须找到所有拥有相同价值的夫妻。所以当一条记录在一对夫妇中使用时,它不能在另一对夫妇中重复使用。

例如,这两个表:

CREATE TABLE [Tab1]([ID1] [int], [Val] [int]) 
CREATE TABLE [Tab2]([ID2] [int], [Val] [int])
INSERT [Tab1] ([ID1], [Val]) VALUES (1, 10)
INSERT [Tab1] ([ID1], [Val]) VALUES (2, 20)
INSERT [Tab1] ([ID1], [Val]) VALUES (3, 20)
INSERT [Tab1] ([ID1], [Val]) VALUES (4, 50)
INSERT [Tab1] ([ID1], [Val]) VALUES (5, 100)
INSERT [Tab2] ([ID2], [Val]) VALUES (1, 20)
INSERT [Tab2] ([ID2], [Val]) VALUES (2, 10)
INSERT [Tab2] ([ID2], [Val]) VALUES (3, 50)
INSERT [Tab2] ([ID2], [Val]) VALUES (4, 30)
INSERT [Tab2] ([ID2], [Val]) VALUES (5, 20)
GO

一个好的答案是(有多种解决方案,但一个就足够了):

ID1  ID2    Val
---  ----   ---
2    1      20
1    2      10
4    3      50
3    5      20

我正在寻找一个查询来找到这个结果。我使用 SQL Server 2005,但如果需要,我可以使用 SQL Server 2008。

这将适用于 SQL Server 2008,但我不确定它是否适用于 2005。

SELECT t1.Val, ID1, ID2 FROM
(SELECT Val, ID1, RANK() OVER (PARTITION BY Val ORDER BY ID1) rank FROM Tab1) t1
INNER JOIN
(SELECT Val, ID2, RANK() OVER (PARTITION BY Val ORDER BY ID2) rank FROM Tab2) t2
ON t1.Val = t2.Val AND t1.rank = t2.rank

这里的技巧是根据 ID 对每个 table 中的 ID 进行排名,并根据 Val 进行分区。比仅按排名加入 returns 有效结果。

这里是 SQLFiddle