我有两个具有完全相同架构的表。一个是一周大,另一个是最新的。让新记录为new_data,旧记录为old_data。两者都有一个名为opportunity_id的列,它是主键,销售阶段(1,2,3,4..etc)和sales_values。现在,在一周内,销售阶段可能会因机会而改变,或者机会的销售价值可能会发生变化。甚至可以添加新的Opportunity_id。我需要所有已更改的数据。
我正在尝试INNER_JOIN,但只有在opportunity_ids匹配时才有效。我也需要新添加的机会。
我正在使用MS Access,所以请仅提供sql解决方案。
由于
答案 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));