Обновление таблицы SQL путем нацеливания на уникальную строку один на один меньше - PullRequest
1 голос
/ 11 января 2012

У меня есть таблица со следующими столбцами

Все столбцы являются nvarchar ожидаемыми для столбцов Date, которые являются datetime

CreateDateA InvIDA StorageIDA CreateDateB InvIDB StorageIDB UniID

Что я хочуДля этого нужно переместить значения в каждой строке (на основе UniID) в репрезентативные столбцы B, где UniID на 1 меньше, поэтому столбцы «A», где UniID = 2, должны идти в столбцы B, где UniID = 1.

Это запрос, который я использую, но он не обновляет никакие столбцы.

update InvSubmission
set CreateDateB = CreateDateA,
InvIDB = InvIDA ,
StorageIDB = StorageIDA 
where StorageIDB = StorageIDA and UniID = (select UniID-1 from InvSubmission)

В этой таблице несколько идентификаторов хранилища, однако каждая запись соответствует как минимум одному другомустроки.

Ответы [ 3 ]

2 голосов
/ 11 января 2012

@ Ответ PinnyM близок, но в SQL Server вы также должны назвать обновленную таблицу в предложении from:

update toUpdate
set CreateDateB = sourceTable.CreateDateA,
    InvIDB = sourceTable.InvIDA
FROM
    InvSubmission toUpdate
        inner Join
    InvSubmission sourceTable
       ON sourceTable.UniID = toUpdate.UniID + 1
       AND sourceTable.StorageIDA = toUpdate.StorageIDB

В противном случае эта заметка становится актуальной:

Если обновляемый объект совпадает с объектом в предложении FROM, и в предложении FROM есть только одна ссылка на объект, псевдоним объекта может указываться или не указываться

И затем вы столкнулись с той же проблемой, на которую указывал @Yuck - вы пытаетесь сравнить значение UniID в одной строке со значением на единицу меньше, чем оно само.

1 голос
/ 11 января 2012

На самом деле это может зависеть от того, какую СУБД вы используете (некоторые привередливы в том, как можно использовать псевдонимы), но вы можете попробовать:

1 голос
/ 11 января 2012

UniID = (select UniID-1 from InvSubmission) эквивалентно UniID = UniID - 1.Так, например, вы в основном говорите:

WHERE 2 = (2 - 1)

И это никогда не будет правдой, поэтому запрос ничего не меняет.

Если оба значения * 1008Столбцы * и B находятся в той же строке, в которой даже нет необходимости указывать с помощью предложения ID.В противном случае вам нужно присоединиться к себе следующим образом:

update InvSubmission
set CreateDateB = B.CreateDateA,
    InvIDB = B.InvIDA ,
    StorageIDB = B.StorageIDA
from InvSubmission A INNER JOIN
     InvSubmission B ON A.UniID = B.UniId - 1
where A.StorageIDB = A.StorageIDA;

Как я уже упоминал, это немного сбивает с толку, потому что в вашем примере это выглядит как столбцы все содержатся в одной строке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...