在SQL中查找两个表之间的差异

时间:2013-06-18 21:24:20

标签: sql ms-access

我有两个具有完全相同架构的表。一个是一周大,另一个是最新的。让新记录为new_data,旧记录为old_data。两者都有一个名为opportunity_id的列,它是主键,销售阶段(1,2,3,4..etc)和sales_values。现在,在一周内,销售阶段可能会因机会而改变,或者机会的销售价值可能会发生变化。甚至可以添加新的Opportunity_id。我需要所有已更改的数据。

我正在尝试INNER_JOIN,但只有在opportunity_ids匹配时才有效。我也需要新添加的机会。

我正在使用MS Access,所以请仅提供sql解决方案。

由于

3 个答案:

答案 0 :(得分:4)

您正在寻找的是 EXISTS 子句。它返回符合条件(或不匹配)的行。您的查询看起来像这样:

SELECT * 
FROM   new_data AS n 
WHERE  NOT EXISTS (SELECT * 
                   FROM   old_data AS o 
                   WHERE  n.opportunity_id = o.opportunity_id 
                          AND n.sales_stages = o.sales_stages 
                          AND n.sales_values = o.sales_values) 

答案 1 :(得分:0)

您应该使用LEFT OUTER JOIN(左边的表格是New_Data)

SELECT n.opportunity_id, n.sales_stage, n.sales_values, [o].sales_stage, [o].sales_values
FROM new_data AS n LEFT JOIN old_data AS o 
  ON n.opportunity_id = [o].opportunity_id
WHERE (((n.sales_stage)<>[o].[sales_stage])) 
   OR (((n.sales_values)<>[o].[sales_values])) 
   OR ((([o].opportunity_id) Is Null));

答案 2 :(得分:0)

如果您确实需要所有更改,还需要考虑另外一个案例。

删除的密钥怎么样?意义密钥存在于old_data而不是new_data中。要获得这些,请使用相同的通用方法(在我有限的经验中,OUTER JOIN似乎在Access中表现更好):

SELECT [o].opportunity_id
FROM new_data AS n RIGHT JOIN old_data AS o 
  ON n.opportunity_id = [o].opportunity_id
WHERE ((([o].opportunity_id) Is Not Null))
  AND ((([n].opportunity_id) Is Null));