SQLite 查找两个表之间的差异

Co *_*der 2 mysql sql sqlite

我有两个表,都包含id(primary key),contact_idname。我想找出两个表之间的差异。因此,如果 中的一条记录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,然后在弹出屏幕中选择取消。

CL.*_*CL. 5

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)