比较postgres中的两个表

时间:2015-05-26 22:05:13

标签: sql postgresql

我有两张定义相同的表:

create tabA (
user_id int,
contact boolean,
promote boolean
);

create tabB (
user_id int,
contact boolean,
promote boolean
);

我想比较两列contactpromote,看看行数据是否存在差异。例如:

来自tabA的

行:1,T,T
tabB中的一行:1,T,F

所以现在存在差异,我想抓住它,只选择那些不相等的行。

4 个答案:

答案 0 :(得分:1)

SELECT * FROM tabA, tabB 
WHERE tabA.user_id = tabA.user_id 
AND (
 tabA.contact != tabB.contact 
 OR
 tabA.promote != tabB.promote
);

答案 1 :(得分:0)

只要可以有NULL值,您需要使用null-safe operators

SELECT user_id, a.contact AS a_contact, a.promote AS a_promote 
              , b.contact AS b_contact, b.promote AS b_promote 
FROM   tabA a
JOIN   tabB b USING (user_id)
WHERE  a.contact IS DISTINCT FROM b.contact OR
       a.promote IS DISTINCT FROM b.promote;

答案 2 :(得分:0)

要查找表内容中的差异,您应该比较下一个查询的3列值:

select (
        select count(*) from (
            select * from a
            union
            select * from b
        ) m
    ) merged,
    (select count(*) from a) in_a,
    (select count(*) from b) in_b;

如果merged列中的值不等于in_ain_b列中的值,则表ab的内容至少有一个差异。

答案 3 :(得分:0)

另一种选择是使用Postgres的记录比较功能:

                  x1  x2  x4  x5
Name                   
James   Option1   1   0   0   2
        Option2   0   1   1   1
        Option3   1   1   1   3
        Option4   0   1   1   1
        Option5   1   0   0   2
        Option6   1   1   1   3
Dean    Option1   0   0   0   0
        Option2   1   0   1   0
        Option3   1   0   1   0
        Option4   0   0   0   0
        Option5   1   0   1   0
        Option6   0   0   0   0
William Option1   0   1   0   0
        Option2   0   0   0   0
        Option3   1   1   0   1
        Option4   0   1   0   0
        Option5   1   0   0   1
        Option6   1   0   0   1