簡體   English   中英

SQL更新1個表中的多行

[英]SQL updating multiple rows in 1 table

我有個問題。 我正在使用MS SQL Server Management Studio。

我有一個包含很多翻譯的詞典表。 我需要將完整的描述從一個languageID復制到另一個languageID。

下面的例子。

LanguageID | Description
    2      | Some text
    2      | More text
    2      | Some more text
   10      | *needs to be replaced
   10      | *needs to be replaced
   10      | *needs to be replaced

結果必須是這樣的:

LanguageID | Description
    2      | Some text
    2      | More text
    2      | Some more text
   10      | Some text
   10      | More text
   10      | Some more text

LanguageID 2和10的描述必須完全相同。

我當前的查詢遇到錯誤:

update tblDictionary
set Description = (Select Description from tblDictionary where 
tblDictionary.LanguageID = 2)
where LanguageID = 10

消息512,級別16,狀態1,行1子查詢返回的值超過1。 當子查詢遵循=,!=,<,<=時,這是不允許的

,> =或將子查詢用作表達式時。 該語句已終止。

如果LanguageID 10的所有翻譯必須與languageID 2的翻譯完全相同,則可以輕松刪除ID 10的所有翻譯,然后重新插入。
像這樣

delete from tblDictionary where LanguageID = 10;

insert into tblDictionary (LanguageID, Description)
select 10, d.Description
from   tblDictionary d
where  d.LanguageID = 2

該方法還具有以下優勢:如果較少的記錄具有LanguageID = 10 ,則對於LanguageID = 2將在同一過程中對其進行更正。

如果tblDictionary中的列多於需要修改的插入語句

DECLARE @temp varchar(50)
DECLARE language_cursor CURSOR FOR  
SELECT Description FROM tblDictionary  
WHERE LanguageID = 2  
ORDER BY Description;  

OPEN language_cursor;  

-- Perform the first fetch.  
FETCH NEXT FROM language_cursor
into @temp;  

-- Check @@FETCH_STATUS to see if there are any more rows to fetch.  
WHILE @@FETCH_STATUS = 0  
BEGIN  
   update TOP (1) tblDictionary
   set Description = @temp
   where Description = ''
   and LanguageID = 10;  
   FETCH NEXT FROM language_cursor
   into @temp;
END  

CLOSE language_cursor;  
DEALLOCATE language_cursor;  

首先將所有languageID 10設置為空,然后循環遍歷languageID 2的所有描述以逐一更新為languageID 10,直到填充languageID10中的所有空白描述。

現在,如果您真的想要更新,即使我認為表的結構需要改進,類似的事情也應該起作用。

WITH l2 AS 
(SELECT *,  
 ROW_NUMBER() OVER(PARTITION BY LanguageId ORDER BY Description ASC) AS No FROM tblDictionary WHERE LanguageId=2),
l10 AS 
(SELECT *,  
 ROW_NUMBER() OVER(PARTITION BY LanguageId ORDER BY Description ASC) AS No FROM tblDictionary WHERE LanguageId=10)

UPDATE l10 SET Description = l2.Description 
FROM l10
INNER JOIN l2 ON l10.No = l2.No

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM