比较两个SQLite表的差异

zf9nrax1  于 2023-02-09  发布在  SQLite
关注(0)|答案(4)|浏览(445)

我有两个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。
我应该如何比较这两个表?

rseugnpd

rseugnpd1#

你能试试用-

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

你应该能给予结果-

AValue  |  BValue
  1     |     2

我使用了distinct,因为您的表没有定义主键或unique,因此没有Distinct的查询可能会显示重复项。
你也可以尝试使用一些免费的数据库比较工具来进行复杂的比较。有一些工具可以比较表、过程等。这些工具也会为差异生成脚本。但是,我从来没有这样的工具用于sql lite。所以,我不确定这样的工具是否适用于sql lite。

dw1jzc5e

dw1jzc5e2#

您也可以简单地使用DiffKit这样的工具:
www.diffkit.org

9jyewag0

9jyewag03#

我找到了答案。如果表有多列,那么代码就很多,但是我可以使用相同的模式通过编程生成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
)
ig9co6j1

ig9co6j14#

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

不幸的是,这是从付费专业版截图。也有一个免费版本,但它不能比较不同的表,但它可以比较不同的数据库文件之间的相同表。
如果需要构建基于SQL的解决方案,则一般方法应该是完全外部连接,它可以返回任何表中的公共/匹配记录和丢失记录。它是not supported by SQLite,但可以以不同的方式是emulated。然而,它不适用于此具体情况,因为这些表没有主键。

相关问题