2016-10-10 2 views
-2

UPDATE 쿼리 여러 값업데이트 여러 값을 가진 열

테이블 이름과 열 : 나는 당신이 확신으로

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

스키마를 표준화해야합니다. 쉼표로 구분 된 값을 단일 열에 포함시키는 것은 좋지 않습니다. – Blorgbeard

+0

데이터베이스를 만들지 않았기 때문에 이미 만들어져 있으므로 변경해야합니다. –

+0

@ A.Konda. . . 이 작업을 수행하는 것보다는 데이터 구조를 수정하는 것이 더 적은 노력입니다. –

답변

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

이러한 종류의 데이터는 실제 시나리오에서 기대되지 않습니다.

여기 처리 방법이 있습니다.

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 
관련 문제