UPDATEクエリに複数の値更新複数の値を持つ列
テーブル名と列:私はあなたが持っている確信しているよう
Book
Book_Name| Authors
---------|---------
C# | 1,2
C++ | 3
Java | 2,4
UPDATEクエリに複数の値更新複数の値を持つ列
テーブル名と列:私はあなたが持っている確信しているよう
Book
Book_Name| Authors
---------|---------
C# | 1,2
C++ | 3
Java | 2,4
かいつまんへ
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
アップデート帳表読む。これはデータベースの設計が悪いですが、このコードでは必要となるのが得られます。私はいくつかの一時テーブルを作成しました。注*データがたくさんある場合はパフォーマンスを向上させることができますが、デザインに基づいて再設計する必要のあるデータが多い場合は、そのデザインに基づいています。
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つがあります。
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
スキーマを正規化する必要があります。コンマ区切りの値を1つの列に入れるのは悪い考えです。 – Blorgbeard
私はそれがすでに作成されているようにデータベースを作成していないので、私は変更を加えるべきです。 @A.Konda。 –
。 。 。この作業を行うよりも、データ構造を修正する方が簡単です。 –