当我搜索如何在SQLite中比较两个表时,看看有什么不同,我主要找到这样的答案:
SELECT B.id FROM B LEFT JOIN A ON B.id = A.id WHERE A.id IS NULL
并且是的,如果你想在表B中找到不在表A中的所有元素(或在这种情况下名为'id'的键的值),那么它是正确的,即如果B是B,则表示B中的所有新元素A的后期版本。
但我想要更多。我想找到B中的所有id:s,其中某个键(或键)的值偏离A中的相应值。例如,如果我有两个表,A和B,使用id:s和position(x_value,y_value),我希望在这种情况下得到结果 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
答案 0 :(得分:3)
您可以使用inner join
条款中的where
来完成此操作。
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)
答案 1 :(得分:1)
您可以使用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
。
答案 2 :(得分:0)
我同意shawnt00,你可以阅读这样的问题,即目标是找到所有id:s,其中值在两个表之间发生了变化,并且id:插入到第二个表中的新实例的s。如果有人感兴趣,这是完成该选择的声明:
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;