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

时间:2015-10-09 13:28:46

标签: sqlite select left-join

当我搜索如何在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

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;
相关问题