比较两个SQLite表的差异

时间:2010-10-31 04:43:44

标签: sql sqlite

我想要比较两个SQLite表。要设置表格:

CREATE TABLE A (Value);
CREATE TABLE B (Value);

INSERT INTO A VALUES (1);
INSERT INTO A VALUES (1);

INSERT INTO B VALUES (2);
INSERT INTO B VALUES (1);

我比较两个表时最接近的是使用下面的SQL:

SELECT 'A' AS Diff, *
FROM (SELECT * FROM A EXCEPT SELECT * FROM B)
UNION ALL
SELECT 'B' AS Diff, *
FROM (SELECT * FROM B EXCEPT SELECT * FROM A)

我想要的结果是

A; 1
B; 2

但是,我只能

B; 2

因为EXCEPT关键字会删除表A中的所有1,无论表B中有多少1个。

我应该如何比较两张桌子?

4 个答案:

答案 0 :(得分:1)

您可以尝试使用 -

select Distinct A.Value as Avalue,B.Value as Bvalue from a inner join B on A.Value <> B.Value

这会给你一个结果 -

AValue  |  BValue
  1     |     2

我使用了一个独特的,因为你的表没有定义主键或uniques,所以有可能这个没有Distinct的查询会显示重复项。

您还可以尝试使用一些可用于复杂比较的免费数据库比较工具。有些工具可以比较表格,程序等。这些工具还可以生成差异的脚本。但是,我从来没有只为sql lite这样的工具。所以,我不确定这些工具是否适用于sql lite。

答案 1 :(得分:1)

你也可以简单地使用像DiffKit这样的工具:

www.diffkit.org

答案 2 :(得分:0)

我找到了答案。如果表有多列,那么代码很多,但我可以使用相同的模式以编程方式生成SQL。

/* Create Example Data */       
CREATE TABLE A (TheValue);      
CREATE TABLE B (TheValue);      
INSERT INTO A VALUES (1);       
INSERT INTO A VALUES (1);       
INSERT INTO B VALUES (2);       
INSERT INTO B VALUES (1);       

/* Format data */       
CREATE TABLE TmpA (Id INTEGER PRIMARY KEY, TheValue);       
CREATE TABLE TmpB (Id INTEGER PRIMARY KEY, TheValue);       
INSERT INTO TmpA (TheValue) SELECT * FROM A ORDER BY TheValue;      
INSERT INTO TmpB (TheValue) SELECT * FROM B ORDER BY TheValue;      
CREATE INDEX idx_TmpA ON TmpA (TheValue ASC);       
CREATE INDEX idx_TmpB ON TmpB (TheValue ASC);       

/* Result */        
SELECT 'A' AS Diff, *       
FROM        
(       
        SELECT Id - (SELECT Min(Id) FROM TmpA AS A2 WHERE A2.TheValue = TmpA.TheValue) AS SubNum, TheValue
        FROM TmpA
        EXCEPT
        SELECT Id - (SELECT Min(Id) FROM TmpB AS A2 WHERE A2.TheValue = TmpB.TheValue) AS SubNum, TheValue
        FROM TmpB
)       
UNION ALL       
SELECT 'B' AS Diff, *       
FROM        
(       
        SELECT Id - (SELECT Min(Id) FROM TmpB AS A2 WHERE A2.TheValue = TmpB.TheValue) AS SubNum, TheValue
        FROM TmpB
        EXCEPT
        SELECT Id - (SELECT Min(Id) FROM TmpA AS A2 WHERE A2.TheValue = TmpA.TheValue) AS SubNum, TheValue
        FROM TmpA
)       

答案 3 :(得分:0)

如果只需要观察变化,您可以使用 KS DB Merge Tools for SQLite(我是该工具的作者): query result diff

不幸的是,这是付费专业版的屏幕截图。还有一个免费版本可用,但它不能比较不同的表,但它可以比较不同数据库文件之间的同一个表。

如果需要构建基于 SQL 的解决方案,那么一般方法应该是 full outer join,它可以返回公共/匹配记录和任何表中缺失的记录。它是 not supported by SQLite 但可以以不同的方式 emulated。然而,它不适用于这种具体情况,因为这些表没有主键。