2012-05-28 1 views
0

테이블 (table1)에 새 열을 만들었습니다. 다른 테이블, table2에서 데이터를 채우려고합니다.두 문자열에 겹침이 있음을 알면 CharIndex를 반환합니다.

표 1에는 '이름'이라는 열이 있습니다. 'Name'은 열의 언어를 나타내는 하위 문자열을 포함합니다. 이 하위 문자열을 table2의 'Language'열과 비교하고 이름 열에 부분 문자열을 포함하고 해당 LanguageID를 새 열에 삽입하고 싶습니다.

그래서, 예를 들면 :

table1 
Name 
xxXxxxXxxxxxzxzxzxz xxxazxzxxXXXZxxzxzx 2183909213 ENG-UK nfjksdnfnd 723984782347 

및 표 2 다음 표 이름 열에서

table2 
    Language | ID 
    ENG-uk | 1 

, 이전과 언어 이후의 문자열은 어떤 형태, 문자의 다양한 수를 취할 수 있습니다. 언어는 항상 앞뒤에 공백이 있습니다. 내가 생각이 쿼리 작업을해야했다

table1 
Name | LanguageID 
xx... | 1 

:

그래서, 내가 끝낼 싶어 나는이 프로그램을 실행할 때

INSERT INTO table1 (LanguageID) 
SELECT t2.ID FROM table2 t2, table1 t1 WHERE CHARINDEX(LOWER(t2.Language), LOWER(t1.Name)) != null 

문제는,이다 .... " (0 행이 영향을 받음) "이 될 수 있습니다.

누구에게 아이디어가 있습니까?

+0

왜 표에 삽입을 사용하고 있습니다. table1의 ID 열을 table2의 일치하는 이름 열로 업데이트 하시겠습니까? – Kashif

+1

첫 번째 테이블 정보에 대해 개별 열을 추가하는 것을 고려해야합니다.그렇지 않으면 SubString 조작으로 인해 성능 문제가 발생합니다. 첫 번째 테이블에서 테이블 스키마가 정규화되지 않았 음을 분명히 알 수 있습니다. 또한 첫 번째 테이블 스키마는 모든 검색/정렬 작업에 적합하지 않습니다. – Nilish

+0

이것은 첫 번째 테이블 정보의 개별 열을 채우기 위해 사용하는 off 명령문입니다. 그것은 정상화되었습니다. –

답변

2

전혀 일치하지 않는 이유는 null 값을 비교하기 위해 != 연산자를 사용할 수 없다는 것이므로 is not null을 사용해야합니다.

그러나 반환 값이 charindex이 아니므로 매우 큰 결과를 얻을 수 있습니다. 문자열이 발견되지 않으면 0을 반환하므로 비교해야합니다.

update t1 
set LanguageID = t2.ID 
from table1 t1 
inner join table2 t2 on charindex(lower(t2.Language), lower(t1.Name)) != 0 
+0

완벽하게 일했고, 내가 많은 것을 배웠던 설명에 대해 대단히 감사합니다. :). –

-2

첫 번째 테이블 정보에 개별 열을 추가하는 것을 고려해야합니다. 그렇지 않으면 SubString 운영으로 인해 Performance Issues이됩니다.

테이블 스키마가 Normalized이 아니라는 것이 첫 번째 테이블에서 분명합니다. 또한 첫 번째 테이블 스키마는 모든 검색/정렬 작업에 적합하지 않습니다.

+0

첫 번째 테이블에 열을 추가 할 수 있도록 한 번씩 설명되어 있습니다. –

0

1, CHARINDEX 반환 0 검색 문자열이 존재하지 않습니다

또한, 당신은 당신이 먼저 기록을 한 후, 테이블에 열을 추가 업데이트 할 필요가, 열을 삽입 할 수 없습니다. null을하지 않습니다. http://msdn.microsoft.com/en-us/library/ms186323.aspx

둘째로, 나는 이 아니라 INSERT이되어야한다고 생각합니다.

예 (t2.Language이 고유하지 않으면이 제대로 작동하지 않습니다) :

UPDATE table1 t1 
SET t1.LanguageID = (SELECT t2.ID from table2 t2 where CHARINDEX(LOWER(t1.Name), LOWER(t2.Language))>0) 
where exists (SELECT t2.ID from table2 t2 where CHARINDEX(LOWER(t1.Name), LOWER(t2.Language))>0) 
관련 문제