Сравнение двух таблиц SQLite для сравнения - PullRequest
2 голосов
/ 31 октября 2010

У меня есть две таблицы 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 удаляет все 1, приходящие из таблицы A, независимо от того, сколько единиц в таблице B.

Как мне сравнивать две таблицы?

Ответы [ 3 ]

1 голос
/ 14 ноября 2010

Вы также можете просто использовать такой инструмент, как DiffKit:

www.diffkit.org

1 голос
/ 31 октября 2010

Можете ли вы попробовать использовать -

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 будет отображать дубликаты.

Вы также можете попробовать использовать некоторые бесплатные инструменты сравнения баз данных, которые доступны для сложных сравнений.Существуют инструменты, которые сравнивают таблицы, процедуры и т. Д. Они также генерируют сценарии для различий.Но у меня никогда не было такого инструмента для SQL.Так что я не уверен, что такие инструменты доступны для SQL Lite.

0 голосов
/ 31 октября 2010

Я узнал ответ.Много кода, если таблицы имеют несколько столбцов, но я могу просто программно сгенерировать 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
)       
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...