2014-01-30 1 views
0

두 테이블의 데이터를 비교 한 후 플래그 열을 채워야합니다. 난이 테이블 A 및 B.SQL Server : 두 테이블을 비교하고 플래그 열 채우기

표 A :

NAME----PHONE-----ID1---------ID2 
MAT------123456-----0.123-----2.123 
NICK-----234672----123-------234 
SAM-----111111-----456------987 

표 B 열은 ID_A, ID_B, ID_C, ID_D ,,, 등등 .. 그리고 ID1 유사한 데이터를 가지고 에 ID2 표 A

표 A에서 ID1 또는 ID2 다음 표 B. 요구 사항의 플래그 컬럼에 'Y'를 넣어 각각의 행에 대해 표 B에 어떤 값을 일치 꽤 똑바로하지만 난 방법을 잘 모르겠습니다 경우 코딩을 시작합니다. 도와주세요. 감사하겠습니다.

답변

0

내가 제대로 이해한다면, 당신은 case 문과 exists 절을 사용하여이 작업을 수행 할 수 있습니다 : 당신이 실제로 업데이 트를 원하는 경우

:

select b.*, 
     (case when exists (select 1 
          from tableA a 
          where a.id1 in (b.id_a, b.id_b, b.id_c, b.id_d) or 
           a.id2 in (b.id_a, b.id_b, b.id_c, b.id_d) 
         ) 
      then 'Y' 
      else 'N' 
     end) as flag 
from tableB b; 

편집

update b 
    set flag = (case when exists (select 1 
            from tableA a 
            where a.id1 in (b.id_a, b.id_b, b.id_c, b.id_d) or 
             a.id2 in (b.id_a, b.id_b, b.id_c, b.id_d) 
           ) 
        then 'Y' 
        else 'N' 
       end); 
+0

빠른 답장을 보내 주셔서 감사합니다. 귀하의 쿼리를 이해하지 못했지만 그것에 대해 의심의 여지가 있지만 어쨌든 우리는 모든 컬럼을 동적으로 얻을 수 있고 테이블 b는 약 45 열을 가지고 있기 때문에 id1과 비교할 수 있으며 하드 코딩이 불가능합니다. 미안, 내가 언급 했어야 했어. – sql84

+0

@sqlsean. . . 그것을 하드 코딩해야합니다. 데이터를 비정규 화 된 형식으로 저장하면 이러한 현상이 발생합니다. 'column_name from information_schema.columns where table_name = 'tableA ''을 사용하여 열 목록을 가져올 수 있습니다. –

0

이 시도 :

UPDATE b 
SET  Flag = CASE WHEN EXISTS 
     (
      SELECT x.ID FROM 
      (
       SELECT b.ID_A UNION ALL 
       SELECT b.ID_B UNION ALL 
       SELECT b.ID_C UNION ALL 
       SELECT b.ID_D UNION ALL 
       SELECT b.ID_E 
      ) x(ID) WHERE x.ID IS NOT NULL 
      INTERSECT 
      SELECT y.ID FROM dbo.TableA a CROSS APPLY 
      (
       SELECT a.ID1 
       UNION ALL 
       SELECT a.ID2 
      ) y(ID) WHERE y.ID IS NOT NULL 
     ) THEN 'Y' ELSE 'N' END 
FROM dbo.TableB b; 
관련 문제