2013-06-18 61 views
1

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

我在尝试INNER_JOIN,但只适用于opportunity_ids match.I需要新增加的机会。

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

感谢

回答

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) 
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)); 
0

如果你真的需要ALL的变化,有一个更多的情况下考虑。

删除的密钥怎么样?意义键存在于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));