2013-04-05 4 views
1

'tracking_table'이라는 15 개의 테이블에서 업데이트를 추적하는 테이블이 있습니다. 15 테이블 모두에 대해 하나의 테이블 만 원했기 때문에 'tracking_table'에 10 개의 열을 유지했습니다.이 테이블은 15 개 테이블 모두에서 cols가없는 최대 값입니다.한 테이블의 행 값을 다른 테이블의 열 이름에 매핑

이제 tracking_table에서 다음 구조의 특정 테이블의 특정 열에 대한 최신 업데이트를 가져올 수 있습니다.

p_key_no col_name value    table 
__________________________________________________________________ 
1  ALTEMAIL [email protected]   emp_info 
1  PASSWORD AA321     emp_info 
2  ALTEMAIL [email protected]   emp_info 
2  EMAIL  [email protected]   emp_info 
2  PASSWORD SB12321     emp_info 

이 테이블의 이름, 열 이름, 특정 행의 기본 키 값 및 변경된 값을 추적합니다.

그리고 emp_info 테이블은 다음과 같다 :

PKEY EMAIL   FULLNAME PASSWORD TIME_STAMP     ALTEMAIL   
1  [email protected] xyz1  AA123  2013-04-05 13:24:49.650  [email protected]  
2  [email protected] xyz2  BB123  2013-04-05 13:24:49.650  [email protected]  
3  [email protected] xyz3  CC123  2013-04-05 13:24:49.650  [email protected]  

나는 특정 항목 만의 갱신 값 emp_info 표를 표시 할.

그래서 행 값을 원래 테이블 열 이름 및 값에 매핑하는 데 도움을주십시오.

미리 감사드립니다.

답변

3

이것은 여러 가지 방법으로 수행 할 수 있습니다. 한 가지 방법은 행의 값을 열로 변환 한 다음 emp_info 테이블에 합치는 tracking_table을 먼저 피벗하는 것입니다.

피벗 코드는 다음과 유사합니다

select p_key_no, ALTEMAIL, PASSWORD, EMAIL 
from tracking_table 
pivot 
(
    max(value) 
    for col_name in (ALTEMAIL, PASSWORD, EMAIL) 
) p 
where [table] ='emp_info' 

SQL Fiddle with Demo를 참조하십시오. 그러면 emp_info 테이블과의 데이터 비교에 사용할 수있는 행의 데이터를 가져옵니다. 최종 코드는 다음과 유사합니다.

;with cte as 
(
    select p_key_no, ALTEMAIL, PASSWORD, EMAIL 
    from tracking_table 
    pivot 
    (
    max(value) 
    for col_name in (ALTEMAIL, PASSWORD, EMAIL) 
) p 
    where [table] ='emp_info' 
) 
select e.pkey, 
    coalesce(c.email, e.email) email, 
    e.fullname, 
    coalesce(c.password, e.password) password, 
    time_stamp, 
    coalesce(c.altemail, e.altemail) altemail 
from emp_info e 
left join cte c 
    on e.pkey = c.p_key_no; 

SQL Fiddle with Demo을 참조하십시오. 이것은 최종 결과를 제공합니다

| PKEY |   EMAIL | FULLNAME | PASSWORD |   TIME_STAMP |  ALTEMAIL | 
------------------------------------------------------------------------------------ 
| 1 | [email protected] |  xyz1 | AA321 | 2013-04-05 13:24:49 | [email protected] | 
| 2 | [email protected] |  xyz2 | SB12321 | 2013-04-05 13:24:49 | [email protected] | 
| 3 | [email protected] |  xyz3 | CC123 | 2013-04-05 13:24:49 | [email protected] | 
피벗은 또한 CASE 표현으로 집계 함수를 사용하여 작성할 수

:하지만 난 (15)가 bcoz가 하드 코딩 만들고 싶어 그나마 @bluefeet

select p_key_no, 
    max(case when col_name = 'ALTEMAIL' then value end) ALTEMAIL, 
    max(case when col_name = 'PASSWORD' then value end) PASSWORD, 
    max(case when col_name = 'EMAIL' then value end) EMAIL 
from tracking_table 
where [table] ='emp_info' 
group by p_key_no 
+0

감사합니다 다른 이름을 가진 열 수가 다른 테이블. – Rohit

+0

@Rohit 매번 테이블 이름을 전달할 예정입니까? 동일한 업데이트 테이블에 15 개의 다른 테이블을 저장하기 때문에 엄청나게 어려울 것이며 동적 SQL 솔루션을 사용해야 할 것입니다. 내가 무엇을 생각해 낼 수 있는지 보자. – Taryn

+0

예 저는 전체 솔루션을 SP로 변환하고 매개 변수로 테이블 이름을 전달할 것입니다. 감사합니다 :) – Rohit

관련 문제