2010-05-11 5 views
1

나는 히스토리 테이블을 가지고 있으며이 테이블의 ColumnName, ColumnValue 폼에서 값을 선택해야합니다. SQL Server 2008을 사용하고 있으며이를 수행하기 위해 PIVOT 함수를 사용할 수 있는지 확실하지 않았습니다. 내가 무엇을ColumnName 및 값으로 행 데이터 선택

이있다 :

테이블의 스키마는 "역사"테이블의 스키마가

CREATE TABLE TABLE1_HISTORY(
    ID INT, 
    NAME VARCHAR(50), 
    TYPE VARCHAR(50), 
    TRANSACTION_ID VARCHAR(50)) 
입니다

CREATE TABLE TABLE1 (ID INT PRIMARY KEY, NAME VARCHAR(50)) 

입니다 아래는 내가 달성하기 위해 필요의 단순화 된 예입니다

다음은 TABLE1_HISTORY의 데이터입니다.

ID NAME  TYPE  TRANSACTION_ID 
1 Joe   INSERT  a 
1 Bill  UPDATE  b 
1 Bill  DELETE  c 
나는이 형식으로 TABLE1_HISTORY에서 데이터를 추출해야

:

엔터프라이즈 에디션으로 업그레이드하고이 변경 내용 추적 기능 내장,이 작업을 수행하기위한 귀하의 제안 무엇 활용 이외에
TransactionId Type  ColumnName ColumnValue 
a    INSERT  ID   1 
a    INSERT  NAME  Joe 
b    UPDATE  ID   1 
b    UPDATE  NAME  Bill 
c    DELETE  ID   1 
c    DELETE  NAME  Bill 

?

답변

1

당신은 UNION

테스트 데이터를 사용하여 시도 할 수

DECLARE @TABLE1_HISTORY TABLE (
    ID INT, 
    NAME VARCHAR(50), 
    TYPE VARCHAR(50), 
    TRANSACTION_ID VARCHAR(50)) 


INSERT INTO @TABLE1_HISTORY 
SELECT 1, 'Joe', 'INSERT', 'a' 
UNION ALL SELECT 1, 'Bill', 'UPDATE', 'b' 
UNION ALL SELECT 1, 'Bill', 'DELETE', 'c' 

SQL 문

SELECT [TransactionID] = Transaction_ID 
      , [Type] = [Type] 
      , [ColumnName] = 'ID' 
      , [ColumnValue] = CAST(ID AS VARCHAR(50)) 
FROM  @Table1_History 
UNION ALL 
SELECT [TransactionID] = Transaction_ID 
      , [Type] = [Type] 
      , [ColumnName] = 'NAME' 
      , [ColumnValue] = [Name] 
FROM  @Table1_History 
ORDER BY TransactionID 
      , ColumnName 
+0

그러나 실제 테이블에는 많은 열이 있으므로 성능이 끔직하기 때문에 모든 단일 열에 대해 select 문을 실행할 필요가 없기를 바랬습니다. – Bobcat1506

+0

실행 계획에서 무엇을 말합니까? 테이블 스캔이 많이 있습니까? 커버 인덱스를 추가하지 않으면 작업 속도가 빨라지는 것입니까? –

1

이 SQL Server의 UNPIVOT 기능을 수행 할 수 있습니다

select transaction_id, 
    type, 
    ColumnName, 
    ColumnValue 
from 
(
    select transaction_id, 
    type, 
    cast(id as varchar(50)) id, 
    name 
    from TABLE1_HISTORY 
) src 
unpivot 
(
    ColumnValue 
    for ColumnName in (ID, Name) 
) un