查找存在于两个不同表中的单个行
Posted
技术标签:
【中文标题】查找存在于两个不同表中的单个行【英文标题】:Find individual rows that exist in two different tables 【发布时间】:2018-02-19 20:46:17 【问题描述】:我有两个 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
【问题讨论】:
如果tableB
只有一个 1
。您是否只希望您的 tableA
1
行之一通过。如果是,是哪一个(或者没关系)?
【参考方案1】:
要实现这一点,您将必须定义某种键来连接或比较两个表。 (无论是 INNER JOIN 还是 INTERSECT,您仍然需要以某种方式将不同的行与下一个行区分开来,因为您希望将 tableA 中的行保留为输出的一部分)。
我们可以使用窗口函数ROW_NUMBER() OVER (PARTITION BY colA ORDER BY 1)
来生成一个在这种情况下工作的键,这将从每个不同的colA
值的数字1开始,并从共享colA
值的每一行开始计数。如果排序很重要,您可以将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;
【讨论】:
以上是关于查找存在于两个不同表中的单个行的主要内容,如果未能解决你的问题,请参考以下文章