1

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

我正在尝试 INNER_JOIN 但这仅在机会 ID 匹配时才有效。我还需要新添加的机会。

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

谢谢

4

3 回答 3

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) 
于 2013-06-18T21:40:58.283 回答
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));
于 2013-06-19T07:16:24.953 回答
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));
于 2013-06-19T18:23:03.320 回答