SQL - 访问条件更新

时间:2012-04-02 16:29:44

标签: sql ms-access

我有一个名为POS_File_Detail的表。我想根据Line_Number的计数更新Invoice_Number,并为每个副本增加1。所以基本上如果我有三个具有相同Invoice_Number的重复条目,它将使用重复的数字更新Line_Number。像这样的东西

    Invoice_Number | Line_Number | Description
    0123456          1             Pepsi
    0123456          2             Chips
    0123499          1             Hot dogs
    0123456          3             Mustard

此表的主键是名为Record_ID的自动编号字段。

我不确定如何将其用于正确的语法,但希望这会告诉你我正在尝试做什么

    UPDATE POS_File_Detail 
    SET POS_File_Detail.Line_Number = Line_Number +1
    WHERE COUNT(Invoice_Number)>1;

2 个答案:

答案 0 :(得分:3)

如果您有一个字段或字段组合,可以很容易地定义重复的Invoice_Number值的顺序,这可能非常简单。如果没有这样的方法,检索那些Invoice_Number值的顺序是任意的。

您有一个名为“Record_ID”的自动编号字段为POS_File_Detail主键。

SELECT
    Invoice_Number,
    DCount("*", "POS_File_Detail",
        "Invoice_Number = '" & [Invoice_Number] & 
        "' AND Record_ID <= " & [Record_ID]) AS Line_Number
FROM POS_File_Detail;

虽然你要求将Line_Number存储在POS_File_Detail中,但我给了你一个SELECT语句。我这样做是因为几乎总是错误地将派生值存储在表中。最好在需要时使用查询派生Line_Number。这样就可以避免存储冗余数据,并确保尽管对POS_File_Detail进行了插入,更新和删除,但Line_Number始终是最新的。

然而如果你有充分的理由在POS_File_Detail中实际存储 Line_Number,你可以将SELECT转换为UPDATE语句。

UPDATE POS_File_Detail
SET Line_Number = DCount("*", "POS_File_Detail",
    "Invoice_Number = '" & [Invoice_Number] &
    "' AND Record_ID <= " & [Record_ID]);

请确保您确实有令人信服的理由存储这些值。

答案 1 :(得分:-1)

WITH CTE(Invoice_Number,Line_Number,Description,NEW_LINE_NUMBER)
AS
(select Invoice_Number,Line_Number,Description,
ROW_NUMBER() over (partition by Invoice_Number  order by Invoice_Number) NEW_LINE_NUMBER from    POS_File_Detail)
UPDATE CTE SET Line_Number=NEW_LINE_NUMBER