查找值不同的表之间的差异
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
:
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;
当我搜索如何在 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
:
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;