2016-10-10 23 views
-2

UPDATEクエリに複数の値更新複数の値を持つ列

テーブル名と列:私はあなたが持っている確信しているよう

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

スキーマを正規化する必要があります。コンマ区切りの値を1つの列に入れるのは悪い考えです。 – Blorgbeard

+0

私はそれがすでに作成されているようにデータベースを作成していないので、私は変更を加えるべきです。 @A.Konda。 –

+0

。 。 。この作業を行うよりも、データ構造を修正する方が簡単です。 –

答えて

0

かいつまんへ

 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 
0

この種のデータは実際のシナリオでは想定されていません。

これを処理する方法の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 
関連する問題