我有两个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
答案 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;