查找存在于两个不同表中的各个行

时间:2018-02-19 20:46:18

标签: sql-server tsql

我有两个SQL表,表A和表B.表A包含一个包含数字的列(colA)。表B包含一列(colB),其中包含数字。

TableA   TableB
colA     colB
----     ----
1        1
1        1
2        2
2        2
3        7

我想选择表A中表B中的所有值。我的期望输出是:

Result
----
1
1
2
2

我尝试了以下查询,但它给了我重复项,因为colA中的每个1对colB中的每个1对,而colA中的每个2对ColB中的每个2:

SELECT colA
FROM TableA
INNER JOIN TableB
ON TableA.colA = TableB.colB

Result
----
1
1
1
1
2
2
2
2

当我将DISTINCT添加到我的SELECT语句时,它会错误地过滤到以下内容,因为它只显示唯一值:

Result
----
1
2

如何选择我想要的输出(如下所示)?

Result
----
1
1
2
2

1 个答案:

答案 0 :(得分:3)

要实现此功能,您必须定义某种键来加入或比较两个表。 (无论是INNER JOIN还是INTERSECT,你仍然需要告诉下一行不同的行,因为你想保留tableA中的行作为输出的一部分)。

要生成一个可以在这种情况下工作的密钥,我们可以使用窗口函数ROW_NUMBER() OVER (PARTITION BY colA ORDER BY 1)这将从每个不同colA值的数字1开始,并开始计算每个共享colA的行。 1}}价值。如果排序很重要,您可以将ORDER BY 1更改为ORDER BY some_other_column

您的查询变为:

 SELECT colA
 FROM (SELECT colA, ROW_NUMBER() OVER (PARTITION BY colA ORDER BY 1) as mykey FROM tableA) tA
      INNER JOIN (SELECT colB, ROW_NUMBER() OVER (PARTITION BY colB ORDER BY 1) as mykey FROM tableB) tB
          ON tA.colA = tB.colB AND tA.myKey = tB.myKey;