我想要比较两个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个。
我应该如何比较两张桌子?
答案 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(我是该工具的作者):
不幸的是,这是付费专业版的屏幕截图。还有一个免费版本可用,但它不能比较不同的表,但它可以比较不同数据库文件之间的同一个表。
如果需要构建基于 SQL 的解决方案,那么一般方法应该是 full outer join,它可以返回公共/匹配记录和任何表中缺失的记录。它是 not supported by SQLite 但可以以不同的方式 emulated。然而,它不适用于这种具体情况,因为这些表没有主键。