UPDATE查询只更改Access

时间:2016-12-22 13:24:54

标签: ms-access duplicates sql-update

示例数据集

TransID   FieldA   FieldB   FieldC   Amount   Status
001       John     Doe      Sr       1.00     Hold
002       John     Doe      Sr       -1.00    Hold
003       John     Doe      Sr       1.00     Hold

Status是唯一未锁定在数据集中的字段。它是三个价值观的枚举; "保持" (默认),"已批准"和"拒绝"。

TransID是一个独特的字段。

我的目标

我想自动批准任何"无效"交易。因此,我想自动批准'上面的交易001和002,但将003留在' hold'员工手动审核的状态。

我的代码

不幸的是,我没有正常运行的代码来解决此问题。而是寻找关于使用什么逻辑的一些指导。

第1部分:显然我在Access中需要一个UPDATE查询来执行Status的更改。我不太担心那部分。

第2部分:我如何识别"无效"记录?

第2a部分:我可以根据FieldAFieldBFieldC查找重复记录。

第2b部分:但那又怎么样?我应该使用什么逻辑来检查另一条记录的Amount是否为{(Amount * -1)?

第2c部分:即使我能识别这些记录,我怎么才会批准"无效"记录?即,Trans 001和003都属于2b部分的标准,那么我怎么才会批准其中一个(可能使用SELECT TOP 1?)但是如果有多个"无效"记录?即,Trans 004和005与002和003完全相同?

我对这一点感到有点难过。任何有关逻辑的帮助将不胜感激。谢谢!

1 个答案:

答案 0 :(得分:0)

我不明白为什么通过SQL无法解决这个问题。

Trans 1和2可以更新为"已批准"如果可以做出一些假设。

  1. 如果净出并且应该被批准的交易的TransID具有比不应该被批准的TransID更低的TransID。

  2. 多对" netting"事务不会发生在同一个人身上,或者它是重复运行更新查询直到它不再更新记录的合理解决方案。

  3. 以下是一个查询,它将使用名称匹配且金额为零的最小TransID更新事务对。

    UPDATE [Table1] 
    SET [Status] = "Approved"
    WHERE [TransID] = (
        SELECT a.minTransID
        FROM (Select Min(TransID) as minTransID, FieldA, FieldB, FieldC, Amount
            FROM Table1
            Where Amount > 0
            Group By FieldA, FieldB, FieldC, Amount
            ) a
        INNER JOIN (
            Select Min(TransID) as minTransID, FieldA, FieldB, FieldC, Amount
            FROM Table1
            Where Amount < 0 and Status = "Hold"
            Group By FieldA, FieldB, FieldC, Amount
            ) b on a.FieldA = b.FieldA and a.FieldB = b.FieldB and a.FieldC = b.FieldC
        )
    OR [TransID] =(
        SELECT B.minTransID
        FROM (Select Min(TransID) as minTransID, FieldA, FieldB, FieldC, Amount
            FROM Table1
            Where Amount > 0
            Group By FieldA, FieldB, FieldC, Amount
            ) a
        INNER JOIN (
            Select Min(TransID) as minTransID, FieldA, FieldB, FieldC, Amount
            FROM Table1
            Where Amount < 0 and Status = "Hold"
            Group By FieldA, FieldB, FieldC, Amount
            ) b on a.FieldA = b.FieldA and a.FieldB = b.FieldB and a.FieldC = b.FieldC
    )