繁体   English   中英

如何在行级别比较两个相同的 PostgreSQL 表的数据相等性?

[英]How can I compare two same PostgreSQL tables for equality of the data at row level?

我想比较两个相同的 PostgreSQL 表以检查它们在行数据中是否相等,所以如果它们不相等,我想查看不同的行。 我怎样才能自动做到这一点? 有没有图书馆或工具?

(我需要用 Java 语言检查一下,但如果你知道其他方法,请分享)

纯 SQL 呢? 您可以将其翻译成 JDBC 然后

这个网站

SELECT
    ID,
    NAME,
    'not in bar' AS note
FROM
    foo
EXCEPT
    SELECT
        ID,
        NAME,
        'not in bar' AS note
    FROM
        bar

或这个

SELECT
    id,
    name
FROM
    foo
FULL OUTER JOIN bar USING (id, name)
WHERE
    foo.id IS NULL
OR bar.id IS NULL;

根据您的评论,您有相同的主键但可能有不同的数据。 让我们考虑具有以下模式的两个表customercustomer_backup

create table customer (id integer, firstname varchar(100), lastname varchar(100));
    insert into customer (id, firstname, lastname) values (1, 'John', 'Doe');
    insert into customer (id, firstname, lastname) values (2, 'Test', 'Test');
    insert into customer (id, firstname, lastname) values (3, 'Jack', 'Smith');
    
create table customer_backup (id integer, firstname varchar(100), lastname varchar(100));
    insert into customer_backup (id, firstname, lastname) values (1, 'John', 'Doe');
    insert into customer_backup (id, firstname, lastname) values (2, 'Test', 'Jack');
    insert into customer_backup (id, firstname, lastname) values (3, 'Will', 'Smith');

因此,要查找差异,您可以在where子句中指定第一个表中的所有字段,这些字段不得等于第二个表中的所有字段:

select *
from customer c
         join customer_backup b on c.id = b.id
where c.firstname <> b.firstname
   or c.lastname <> b.lastname
 # or c.otherField <> (not equal) b.otherField

您可以查看此工作示例

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM