基于复合键比较表的记录

Posted

技术标签:

【中文标题】基于复合键比较表的记录【英文标题】:Comparing records of tables based on composite key 【发布时间】:2015-03-04 15:36:50 【问题描述】:

我有一份需要帮助的工作来刷新查找表数据。我有 2 个包含数据的表,一个是现有版本(table1),另一个是新版本(table2)。每个表的主键是一个复合键。我知道每一行都有不同的行数,我需要找出差异。假设复合主键的 2 列部分分别命名为 column1 和 column2。

通常,在“正常”主键设置中,我只会查找不在另一个表的主键列表中的主键值。但我不知道如何使用复合主键来做到这一点。

我为 SQL Server 找到了一个类似的线程,但在我的情况下似乎不起作用,不确定我是否做错了什么。

How can I compare rows from 2 tables that have composite primary keys?

有人可以帮我比较一下 Oracle/PostgreSQL 中这两个表的行吗?

【问题讨论】:

SELECT ... FROM a WHERE NOT EXISTS (SELECT * FROM b WHERE b.x = a.x AND b.y = a.y); BTW:这顶帽子与主键无关;它也适用于非关键列。 FULL JOIN 查询可以在 Postgres 和 Oracle 中使用。 你想要什么输出?表格中的所有列?还是只是 PK 值? @wildplasser:感谢您的解决方案。答案有效!! @ypercube:感谢您抽出宝贵时间帮助处理此请求。我只需要主键值,并且能够从上一个答案中得到结果。 【参考方案1】:
SELECT ...
FROM a
WHERE NOT EXISTS (
  SELECT *
  FROM b
  WHERE b.x = a.x AND b.y = a.y
  );

顺便说一句:这顶帽子与主键无关;它也适用于非键列。

【讨论】:

【参考方案2】:

您甚至可以将NOT IN 与复合值一起使用。示例:

How do I (or can I) SELECT DISTINCT on multiple columns?

但其他语法变体通常更简单/更快/更可靠:

Select rows which are not present in other table

NOT EXISTS like @wildplasser 已发布是获得最佳性能的良好候选者。

【讨论】:

以上是关于基于复合键比较表的记录的主要内容,如果未能解决你的问题,请参考以下文章

基于条件比较两个子表的聚合返回记录

将复合主键限制为仅一条记录为“未删除”(其中多个“已删除”记录不调用约束)

SQL 更新:无法更改第一条记录的复合键值之一

RedShift - 如何通过复合主键过滤表中的记录?

Hibernate 的复合主键

SQLite:如何使用复合键从单个表中选择“每个用户的最新记录”?