Как сделать сложный запрос на обновление T-SQL? - PullRequest
4 голосов
/ 05 июня 2009

У меня есть таблица базы данных:

Col1 | Col2 | Col3
------------------
  1  |   2  |  -
  2  |   3  |  -
  3  |   4  |  -
  4  |   5  |  -

В столбцах 1 и 2 есть данные, но 3 пусто.

Чего я хочу добиться, это установить Col3 в значение Col1 предыдущей строки (технически предыдущую строку, в которой значение Col1 равно значению Col2), чтобы получить это:

Col1 | Col2 | Col3
------------------
  1  |   2  |  -
  2  |   3  |  1
  3  |   4  |  2
  4  |   5  |  3

Я пытаюсь выполнить запрос на обновление, чтобы добиться этого. Я пробовал такие вещи, как:

UPDATE Table
SET [cur].Col3 = [prev].Col1
FROM Table [cur], Table [prev]
WHERE [cur].Col1 = [prev].Col2

Но, похоже, это не работает для меня. SQL Server принимает синтаксис в хранимой процедуре, но при выполнении выдает ошибку:

Таблица неоднозначна

Что я делаю не так?


Примечание:

Данные в каждом столбце уже гарантированно уникальны, а каждая комбинация Col1 и Col2 уникальна.

Ответы [ 4 ]

2 голосов
/ 05 июня 2009
UPDATE [cur] -- <<====== change here
SET [cur].Col3 = [prev].Col1
FROM Table [cur], Table [prev]
WHERE [cur].Col1 = [prev].Col2
1 голос
/ 05 июня 2009

попробовать:

declare @yourTable table (col1 int, col2 int, col3 int)
INSERT INTO @YourTable values (1,2,NULL)
INSERT INTO @YourTable values (2,3,NULL)
INSERT INTO @YourTable values (3,4,NULL)
INSERT INTO @YourTable values (4,5,NULL)

UPDATE cur
   SET cur.Col3 = prev.Col1
   FROM @YourTable           cur
       INNER JOIN @YourTable prev ON cur.col1=prev.col2

select * from @YourTable

выход:

(1 row(s) affected)

(1 row(s) affected)

(1 row(s) affected)

(1 row(s) affected)

(3 row(s) affected)
col1        col2        col3
----------- ----------- -----------
1           2           NULL
2           3           1
3           4           2
4           5           3

(4 row(s) affected)
1 голос
/ 05 июня 2009
UPDATE [cur] 
SET [cur].Col3 = [prev].Col1
FROM Table [cur]
JOIN Table [prev] on [cur].Col1 = [prev].Col2

Пожалуйста, попробуйте начать использовать синтаксис соединения вместо этого синтаксиса старого стиля. У вас будет меньше проблем, его будет проще обслуживать и не будет случайных перекрестных соединений. И левые соединения будут работать правильно, поскольку они не работают сейчас с синтаксисом * =. Кроме того, вы будете в курсе стандартов 1992 года.

0 голосов
/ 05 июня 2009

Измените первую строку на

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