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

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;

【讨论】:

以上是关于查找存在于两个不同表中的单个行的主要内容,如果未能解决你的问题,请参考以下文章

在一个表中查找不存在于另一个表中的ID

查找第三个表中不存在的两个表的组合

excel中查找两个表格相同数据的方法

如何在两个excel表中查找相同数据

哈希表中的查找

查找超过 100K 个位置之间的距离