Мой сложный запрос SQL Update не работает так хорошо - PullRequest
2 голосов
/ 15 июня 2010

Я пытаюсь обновить таблицу в моей базе данных другой строкой из другой таблицы. У меня есть два параметра, один из которых является идентификатором, а другой - номером строки (так как вы можете выбрать, какую строку вы хотите из графического интерфейса)

эта часть кода работает нормально, возвращается один столбец одной строки.

(SELECT txtPageContent
FROM (select *, Row_Number() OVER (ORDER BY ArchiveDate asc) as rowid 
            from ARC_Content Where ContentID = @ContentID) as test
Where rowid = @rowID)

просто когда я пытаюсь добавить обновление / установить, он не будет работать. Я, наверное, что-то упускаю

UPDATE TBL_Content
Set TBL_Content.txtPageContent = (select txtPageContent
FROM (select *, Row_Number() OVER (ORDER BY ArchiveDate asc) as rowid 
            from ARC_Content Where ContentID = @ContentID) as test
Where rowid = @rowID) 

Спасибо за помощь! (я пробовал топ 1 безрезультатно)

1 Ответ

2 голосов
/ 15 июня 2010

Я вижу несколько проблем с вашим обновлением.Во-первых, я не вижу никаких критериев соединения или выбора для обновляемой таблицы.Это означает, что каждая строка в таблице будет обновлена ​​с этим новым значением.Вы действительно этого хотите?

Во-вторых, номер строки между тем, что находится в графическом интерфейсе, и тем, что вы возвращаете в базу данных, может не совпадать.Даже если вы воспроизводите запрос, использованный для создания вашего списка в графическом интерфейсе пользователя (который в любом случае опасен, поскольку требует постоянного обновления и синхронизации кода выбора), возможно, кто-то может вставить или удалить или обновить строку между временемчто вы заполняете свой список и отправляете этот номер строки на сервер для обновления.Гораздо лучше использовать PK (вероятно, идентификаторы в вашем случае), чтобы определить, какую строку использовать для обновления.

Тем не менее, я думаю, что следующее будет работать для вас (не проверено):

;WITH cte AS (
    SELECT
        txtPageContent,
        ROW_NUMBER() OVER (ORDER BY ArchiveDate ASC) AS rowid
    FROM
        ARC_Content
    WHERE
        ContentID = @ContentID)
UPDATE
    TC
SET
    txtPageContent = cte.txtPageContent
FROM
    TBL_Content TC
INNER JOIN cte ON
    rowid = @rowID
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...