1

我有一个带有事务列表的 MS Access 数据库。我正在尝试更新两条记录上的“匹配”字段,它们在字段中具有一些相同的值(文档编号、凭证编号、子标题)但数量相反。它还需要避免重复。

    Document Number     Amount   ABS     Match
    N6809561990112      438.48   438.48
    N6809561990112      438.48   438.48
    N6809561990112     -438.48   438.48

我在 SQL 之后的最终结果应该是什么样子

    Document Number     Amount   ABS     Match
    N6809561990112      438.48   438.48   Y
    N6809561990112      438.48   438.48
    N6809561990112     -438.48   438.48   Y

表名是“tblUnmatched”

我尝试了以下方法,但它将表中的每条记录更新为“Y”

strSql = "Update tblUnmatched SET match = 'Y' WHERE EXISTS(select * " & _
        "from tblUnmatched t1 " & _
        "inner join tblUnmatched t2 on " & _
        "t1.[DOCUMENT NUMBER] = t2.[DOCUMENT NUMBER]" & _
        "where t1.ABS = t2.ABS AND t1.AMOUNT <> t2.AMOUNT AND t1.SUBH = t2.SUBH)"
DoCmd.RunSQL strSql

我也试过这个,但它无法处理重复的问题。

strSql = "Update tblUnmatched SET match = 'Y' WHERE [DOCUMENT NUMBER] IN(select t1.[DOCUMENT NUMBER] " & _
        "from tblUnmatched t1 " & _
        "inner join tblUnmatched t2 on " & _
        "t1.[DOCUMENT NUMBER] = t2.[DOCUMENT NUMBER]" & _
        "where t1.ABS = t2.ABS AND t1.AMOUNT <> t2.AMOUNT AND t1.SUBH = t2.SUBH)"
    DoCmd.RunSQL strSql
4

1 回答 1

1

在没有主键字段的 Access SQL 中,您的任务是不切实际的。尽管您导入的数据源中没有这样的键,但这并不禁止您在 Access 中添加一个。

将自动编号主键 , 添加idtblUnmatched. 然后对于每一批新的传入数据:

  1. 导入临时表,tblScratch
  2. DELETE FROM tblUnmatched
  3. 将行追加tblScratchtblUnmatched

SELECT FROM <your data source>(如果您可以使用直接附加到tblUnmatched,而不是首先导入到 ,则该过程可能会更简洁tblScratch。)

将以下SELECT语句另存为qryFindMatches

SELECT
    sub.[Document Number],
    sub.Amount,
    sub.MinOfid,
    DCount(
        "*",
        "tblUnmatched",
        "[Document Number]='" & [Document Number]
            & "' AND Amount = -1 * " & [Amount]
        ) AS match_count
FROM
    (
        SELECT [Document Number], Amount, Min(id) AS MinOfid
        FROM tblUnmatched
        GROUP BY [Document Number], Amount
    ) AS sub;

那么UPDATE你想要的可以很容易地创建。注意性能可能不会很快;希望您可以每月容纳一次。

UPDATE tblUnmatched
SET [Match] = True
WHERE id In
    (
        SELECT MinOfId
        FROM qryFindMatches
        WHERE match_count > 0
    );

我在您的示例数据中添加了一行,并使用 Access 2007 进行了测试。我认为这就是您想要的...

id Document Number Amount   Match
 1 N6809561990112   $438.48 True
 2 N6809561990112   $438.48 False
 3 N6809561990112 ($438.48) True
 4 N6809561990112     $5.00 False
于 2013-01-30T18:38:10.767 回答