2014-10-29 8 views
1

Я хочу обновить несколько строк с помощью запроса на обновление. Существует один первичный ключ. Я не хочу обновлять первичный ключ. предположительноОбновление нескольких строк с набором значений sql

id name address age 
1 as re3  20 
2 dg ht5  21 
3 hf ujy6 23 
4 ku tr5  25 

это таблица. Я хочу обновить имя, адрес и возраст последовательно. У меня есть набор новых значений в качестве входных данных. как

("YJ", "ht43", 34)

("RT", "fd43", 36)

("Hg", "hgd4", 40)

(«ui», «udg6», 28)

Как обновить строки последовательно этими значениями с помощью запроса на обновление?

+0

сколько строк вы хотите обновить ??? –

+0

столько строк, сколько у меня есть на входе –

+0

И таблица - это набор результатов. используя TOP n. поэтому я могу получить любое количество строк. если у меня есть 5 наборов входов, мне нужно обновить 5 верхних строк последовательно –

ответ

1

Вы можете сделать это, присвоив номер строки как вашим существующим значениям, так и вашим новым значениям. Затем соединить два набора данных по этому номеру строки, и обновить соответственно:

WITH YourTableRanked AS 
( SELECT t.*, 
      RowNum = ROW_NUMBER() OVER(ORDER BY ID) 
    FROM YourTable AS t 
), NewValues AS 
( SELECT t.*, 
      RowNum = ROW_NUMBER() OVER(ORDER BY Name) 
    FROM (VALUES 
       ('yJ','ht43',34), 
       ('rt','fd43',36), 
       ('hg','hgd4',40), 
       ('ui','udg6',28) 
      ) AS t (Name, Address, Age) 
) 
UPDATE T 
SET  Name = v.Name, 
     Address = v.Address, 
     Age = v.Age 
FROM YourTableRanked AS t 
     INNER JOIN NewValues AS v 
      ON v.RowNum = t.RowNum; 

Стоит отметить, что любой вид TOP, или рейтинг операция либо не действует синтаксис, или не особенно полезно в случае отсутствия его ORDER BY статья. Поэтому, когда вы ссылаетесь на обновление строк «последовательно», чтобы последовательно иметь какой-либо смысл, вам нужно определить порядок этой последовательности. В запросах, которые я опубликовал, я заказал Name в ваших новых значениях и ID для ваших существующих данных, но вы можете изменить это в соответствии с вашими потребностями.


Полный пример:

CREATE TABLE #T (ID INT, Name VARCHAR(2), Address VARCHAR(5), Age INT); 
INSERT #T (id, name, address, age) 
VALUES 
    (1, 'as', 're3', 20), 
    (2, 'dg', 'ht5', 21), 
    (3, 'hf', 'ujy6', 23), 
    (4, 'ku', 'tr5', 25); 

WITH YourTableRanked AS 
( SELECT t.*, 
      RowNum = ROW_NUMBER() OVER(ORDER BY ID) 
    FROM #t AS t 
), NewValues AS 
( SELECT t.*, 
      RowNum = ROW_NUMBER() OVER(ORDER BY Name) 
    FROM (VALUES 
       ('yJ','ht43',34), 
       ('rt','fd43',36), 
       ('hg','hgd4',40), 
       ('ui','udg6',28) 
      ) AS t (Name, Address, Age) 
) 
UPDATE T 
SET  Name = v.Name, 
     Address = v.Address, 
     Age = v.Age 
FROM YourTableRanked AS t 
     INNER JOIN NewValues AS v 
      ON v.RowNum = t.RowNum; 

SELECT * 
FROM #T; 

DROP TABLE #T; 
+0

ouff. спасибо .. это было полезно. :) –

+1

@ K9Code Если это ответит на ваш вопрос, пожалуйста, примите его (нажмите на галочку), чтобы другие люди не тратили время на решение вашей (уже решенной) проблемы. –

Смежные вопросы