更新具有多个值的列

时间:2016-10-10 20:11:59

标签: sql sql-server

UPDATE查询具有多个值的列

表名:

        Book                          Author
Book_Name| Authors        Author_Name | Author_Id
---------|---------        -----------|----------
C#       | A,B            A           | 1
C++      | C              B           | 2
Java     | B,D            C           | 3
                          D           | 4  

将书表更新为

   Book
Book_Name| Authors
---------|---------
C#       | 1,2
C++      | 3
Java     | 2,4

2 个答案:

答案 0 :(得分:0)

长话短说,因为我相信你已经阅读过了。这对数据库来说是一个糟糕的设计,但是这个代码可以让你得到你需要的。我创建了一些临时表。注意*如果有大量数据,您可以提高性能,但根据设计,我认为如果有大量数据需要重新设计。

Declare  @Book table(Book_name Varchar(100)
                    ,Authors Varchar(100)
                    )

Declare  @Author table(Author_name Varchar(100)
                    ,Author_ID Varchar(100)
                    )

Insert into @Book
values ('C#','A,B')
,('C++','C')
,('Java','B,D')

Insert into @Author
Values ('A','1')
,('B','2')
,('C','3')
,('D','4')

Declare @CT Int = (SELECT MAX(LEN(Authors)) from @Book)
        ,@Pos int = 0

While @Pos <= @CT
BEGIN
UPDATE @Book
SET Authors = REPLACE(Authors,Author_name,Author_id)
from @Book b
inner join @Author a
on SUBSTRING(b.Authors,@POS,1) = a.Author_Name
SET @Pos = @Pos + 1
END

select * From @Book

答案 1 :(得分:0)

在任何实际情况下都不会出现这种数据。

这是处理它的一种方法。

Declare @ExecuteNo INT
Select @ExecuteNo = MAX(len(Authors) - len(replace(Authors, ',', ''))) + 1 from Book

WHILE @ExecuteNo > 0
BEGIN
    Update b
    Set b.Authors = Replace(Authors, a.Author_Name, a.Author_Id) from Book b
    cross join Author a
    where CHARINDEX(a.author_name, b.Authors) >= 1
SET @ExecuteNo = @ExecuteNo - 1
END