查找值不同的表之间的差异

Find difference between tables where values differ

当我搜索如何在 SQLite 中比较两个 table 并查看有什么不同时,我通常会找到这样的答案:

SELECT B.id FROM B LEFT JOIN A ON B.id = A.id WHERE A.id IS NULL

是的,如果您想找到 table B 中不在 table A 中的所有元素(或在本例中名为 'id' 的键的值),这是正确的,即如果 B 是 A 的更新版本,则 B 中的所有新元素。

但是,如果我想在 B 中找到所有某个键(或多个键)的 value 偏离 A 中相应值的 id:s 怎么办?例如,如果我有两个 tables,A 和 B 具有 id:s 和位置,并且我想在这种情况下得到结果 id=3,因为 B 中的元素具有不同的值。最简单的方法是什么?

Table A                      Table B

id | x_value | y_value       id | x_value | y_value
-----------------------      -----------------------
1  | 29.9563 | 12.6764       1  | 29.9563 | 12.6764
2  | 45.5843 | 7.6733        2  | 45.5843 | 7.6733 
3  | 28.2313 | 15.6579       3  | 39.2003 | 15.6579

Result:

id
--
3

您可以在 where 子句中使用 inner join 来完成。

select a.id
from tableA a join tableB b on a.id = b.id
where ifnull(a.x_value, 0) <> ifnull(b.x_value, 0) 
      or ifnull(a.y_value, 0) <> ifnull(b.y_value, 0)

您可以使用 INTERSECT:

LiveDemo

SqlFiddleDemo

SELECT tA.id
FROM TableA tA
JOIN TableB tB
  ON tA.id = tB.id
WHERE NOT EXISTS( SELECT tA.x_value, tA.y_value
                  INTERSECT 
                  SELECT tB.x_value, tB.y_value);

我喜欢这个解决方案,因为它易于扩展。只需添加新的列名。无需手动处理 NULL

我同意 shawnt00 的观点,您可以阅读以下问题:目标是找到所有 id:s,其中值在新实例的两个 table 和 id:s 之间发生了变化插入到第二个table。这是实现该目的的 select 语句,如果有人感兴趣的话:

select b.id 
from b left join a on b.id = a.id 
where ifnull(a.x_value, 0) <> ifnull(b.x_value, 0) 
   or ifnull(a.y_value, 0) <> ifnull(b.y_value, 0) 
   or a.id is null;