繁体   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