考虑SQL Server 2008中的以下两个表:
Table1只有一个int字段:Term1
Table2也只有一个int字段:Term2。 (是的,我知道 - 我缺乏想象力。)
假设我在表1中插入以下值:1,2, 5,5, 6,7
我在表2中插入以下值:3,4, 5,5, 8,9
我想运行一个查询,在那里我找到两个表共有的术语,我希望这些配对关闭。因此,当存在重复项时(在这种情况下为5和5),我希望找到的每一对都有一行。换句话说,我希望两对5s返回作为两个共同的术语。
我该怎么做?如果我在Table1和Table2上进行简单的内部联接,我会返回四个对的5个。
编辑:我应该更清楚,我对任何共同的价值感兴趣,而不仅仅是重复。问题是复制品更难处理。
因此,如果我在表1中插入以下值:1,2, 5,5,5,6, 7,8
我在表2中插入以下值:3,4, 5,5,5,6, 9,0
然后我希望将 5,5,5,6 视为常用术语。
答案 0 :(得分:0)
DECLARE @Table1 TABLE (Term1 int)
INSERT INTO @Table1 VALUES (1),(2),(5),(5),(5),(6),(7),(8)
DECLARE @Table2 TABLE (Term2 int)
INSERT INTO @Table2 VALUES (3),(4),(5),(5),(5),(6),(9),(0)
;WITH T1 AS
(
SELECT Term1, ROW_NUMBER() OVER (PARTITION BY Term1 ORDER BY (SELECT 0)) RN1
FROM @Table1
),
T2 AS
(
SELECT Term2, ROW_NUMBER() OVER (PARTITION BY Term2 ORDER BY (SELECT 0)) RN2
FROM @Table2
)
SELECT T1.Term1
FROM T1 JOIN T2 ON T1.Term1=T2.Term2 AND T1.RN1=T2.RN2
输出
Term1
-----------
5
5
5
6