2012-07-23 6 views
-3

다음 열을 특정 번호가 포함 된 열로 업데이트해야합니다.SQL Server : 다음 열을 선택/업데이트 하시겠습니까?

지원 ff 테이블의 열입니다 C.

C1_K | C1_ID | C2_K | C2_ID | C3_K | C3_ID 

논리 : 숫자 5가 발견되는 경우에 대한

  • 봐가 C1_K 또는 C2_K 또는 C3_K에 있습니다.
  • C1_K에 있으면 C1_ID 텍스트 값을 선택하십시오.
  • C2_K에있는 경우 C2_ID 텍스트 값을 선택하십시오.
  • C3_K에 있으면 C3_ID 텍스트 값을 선택하십시오.

일치하는 K 열 옆에있는 열을 업데이트해야합니다. 감사.

참고 :

  • 모든 C * _K 열은 고유 번호가 포함되어 있습니다.
  • 모든 C * _ID 열에는 고유 한 텍스트가 들어 있습니다.

    154 | NULL | 155 | SantoRyUu | 156 | NULL 
    

    경우 155 SantoRyUu ​​업데이트 될 선택된다 :

샘플 데이터 (이들은 이름이다).

+0

'5'값이 세 열 모두에 있으면 어떻게됩니까? – Lamak

+0

그건 불가능합니다 :) – nambla

+0

"K, ID"쌍은 무엇입니까? [반복 그룹] (http://en.wikipedia.org/wiki/First_normal_form)이 자체 표로 분리되어야합니다. –

답변

0

(옆으로 디자인 문제.)

SQL 서버가 구문을 가지고 있지 않기 때문에 당신은 이름으로 열을 언급해야 "옆에." 동적 SQL을 사용하여이 작업을 수행 할 수는 있지만 yuck.

CREATE TABLE dbo.C 
(
    C1_K INT, 
    C1_ID VARCHAR(32), 
    C2_K INT, 
    C2_ID VARCHAR(32), 
    C3_K INT, 
    C3_ID VARCHAR(32) 
); 

INSERT dbo.C(C1_K, C2_K, C3_k) 
SELECT 5,1,2 
UNION ALL SELECT 2,5,7 
UNION ALL SELECT 3,4,6; 

DECLARE @MagicNumber INT; 
SET @MagicNumber = 5; 

UPDATE dbo.C SET 
C1_ID = CASE C1_K WHEN @MagicNumber THEN 'yes' ELSE C1_ID END, 
C2_ID = CASE C2_K WHEN @MagicNumber THEN 'yes' ELSE C2_ID END, 
C3_ID = CASE C3_K WHEN @MagicNumber THEN 'yes' ELSE C3_ID END; 

SELECT * FROM dbo.C; 

결과 : 여기에 하나의 가능성이 당신이 *의 _K 컬럼에 인덱스가있는 경우

C1_K C1_ID C2_K C2_ID C3_K C3_ID 
---- ----- ---- ----- ---- ----- 
5  yes 1  NULL 2  NULL 
2  NULL 5  yes 7  NULL 
3  NULL 4  NULL 6  NULL 
0

select C1_id 
from table where c1_k = 155 
union all 
select C2_id 
from table where c2_k = 155 
union all 
select C3_id 
from table where c3_k = 155 

경우 시도해야 다음 컬럼에 인덱스되지

select 
--coalesce(C1_id,c2_id,c3_id) --if you are sure other two columns values will be null 
case 
when c1_k = 155 then c1_id 
when c2_k = 155 then c2_id 
when c3_k = 155 then c3_id 
end --in case you have values for other columns as 
--well like for 154 you might not have null but some other value.. 

from table where c1_k = 155 
or c2_k = 155 
or c3_k = 155 

위 검색어를 변경하면 이 같은 열이 더 많습니다. 하지만 가장 좋은 해결책은 열을 행으로 변환하는 것입니다.

+0

기성품 시스템. 나는 그것을 다루어야한다 :) 디자인은 실패한다. – nambla

관련 문제