我有两个表,都包含id(primary key),contact_id和name。我想找出两个表之间的差异。因此,如果 中的一条记录table A与 不同table B,则 sql 查询应该找到它。例如,在下面的代码中,('2','test2')B表中没有出现。因此,该记录('2','test2')是两个表之间的差异。但是,我们可能会遇到相反的情况,例如一条记录出现在table B但没有出现table A。或者两个表中的记录contact_id可能相同,但name字段可以不同。在这种情况下,还应该返回不同的记录。我已经这样做了,但它似乎并不适用于所有情况。如何让它适用于所有情况?
CREATE TABLE A
(
id int auto_increment primary key,
contact_id int(20),
name varchar(20)
);
CREATE TABLE B
(
id int auto_increment primary key,
contact_id int(20),
name varchar(20)
);
INSERT INTO A
(contact_id,name)
VALUES
('1','test1'),
('2','test2');
INSERT INTO B
(contact_id,name)
VALUES
('1','test1');
Run Code Online (Sandbox Code Playgroud)
询问:
SELECT * FROM A
EXCEPT
SELECT * FROM B
UNION ALL
SELECT * FROM B
EXCEPT
SELECT * FROM A
Run Code Online (Sandbox Code Playgroud)
这是sqlfiddle: http ://sqlfiddle.com/#!5 /f7f45/9,然后在弹出屏幕中选择取消。
EXCEPT 的绑定并不比 UNION ALL 强(并且缩进查询不会改变这一点),因此数据库将在第二个 EXCEPT 之前执行 UNION ALL。
您必须将两个 EXCEPT 查询移至子查询中,以确保 UNION ALL 最后执行:
SELECT * FROM (SELECT * FROM A
EXCEPT
SELECT * FROM B)
UNION ALL
SELECT * FROM (SELECT * FROM B
EXCEPT
SELECT * FROM A)
Run Code Online (Sandbox Code Playgroud)