我有两张定义相同的表:
create tabA (
user_id int,
contact boolean,
promote boolean
);
create tabB (
user_id int,
contact boolean,
promote boolean
);
我想比较两列contact
和promote
,看看行数据是否存在差异。例如:
行:1,T,T
tabB中的一行:1,T,F
所以现在存在差异,我想抓住它,只选择那些不相等的行。
答案 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_a
和in_b
列中的值,则表a
和b
的内容至少有一个差异。
答案 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