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
答案 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