我有一个名为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;
答案 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