比较SQLite中的两个表

时间:2014-02-10 14:43:35

标签: sql sqlite

我在数据库MyTableMyTableChanges中有两个表。我想检测更改(从MyTableChanges插入/删除的记录或已编辑的记录)。

有可能吗?我想仅使用SQLite个查询来执行此操作。

我知道我可以使用下面的2个查询来检测插入和删除的行:

SELECT DISTINCT SomePrimaryKey
FROM MyTable
WHERE SomePrimaryKey Not IN 
    (SELECT DISTINCT SomePrimaryKey FROM MyTableChanges)

但如何比较变化呢?也许有一些方法,处理列和连接上的哈希。我不知道如何开始。请告诉我!

修改
我知道我可以这样做:

CREATE TABLE Test1
(
  MI_PRINX INTEGER PRIMARY KEY AUTOINCREMENT,
  Name CHAR(100),
  Value INTEGER
);

CREATE TABLE Test2
(
  MI_PRINX INTEGER PRIMARY KEY AUTOINCREMENT,
  Name CHAR(100),
  Value INTEGER
);

INSERT INTO Test1 (Name, Value) VALUES('Name1', 1);
INSERT INTO Test1 (Name, Value) VALUES('Name2', 2);
INSERT INTO Test1 (Name, Value) VALUES('Name3', 3);
INSERT INTO Test1 (Name, Value) VALUES('Name4', 4);

INSERT INTO Test2 (Name, Value) VALUES('Name1', 2);
INSERT INTO Test2 (Name, Value) VALUES('Name3', 3);
INSERT INTO Test2 (Name, Value) VALUES('Name4', 5);
INSERT INTO Test2 (Name, Value) VALUES('Name5', 6);
INSERT INTO Test2 (Name, Value) VALUES('Name6', 7);
INSERT INTO Test2 (Name, Value) VALUES('Name7', 8);

-- suppose Name is unique

SELECT * FROM Test1 JOIN Test2 ON Test1.Name = Test2.Name
WHERE Test1.Value <> Test2.Value

但它有点不舒服的解决方案,因为我需要为很多列创建非常长的查询...还有其他想法吗?

1 个答案:

答案 0 :(得分:1)

使用natural join时,数据库将使用具有相同名称的所有列进行连接。 在这种情况下,这将允许您比较整个记录。

然后,使用外部联接,您可以找出哪个记录​​在另一个表中没有匹配的记录:

SELECT Table1.ID
FROM Table1 NATURAL LEFT JOIN Table2
WHERE Table2.ID IS NULL
相关问题