SQL - Доступ к условному обновлению - PullRequest
4 голосов
/ 02 апреля 2012

У меня есть таблица с именем 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 ]

3 голосов
/ 02 апреля 2012

Это может быть действительно легко, если у вас есть поле или комбинация полей, которые позволяют вам определять порядок дублирования значений 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 с запросом, когда вам это нужно.Таким образом вы избегаете хранения избыточных данных и гарантируете, что Line_Number всегда актуален, несмотря на вставки, обновления и удаления в POS_File_Detail.

Однако , если , у вас есть веская причина для фактического хранения Line_Number в POS_File_Detail, вы можете преобразовать SELECT в инструкцию UPDATE.

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

Пожалуйста, убедитесь, что у вас действительно есть веская причина для хранения этих значений.

0 голосов
/ 02 апреля 2012
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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...