2010-05-11 2 views
1

У меня есть таблица истории, и мне нужно выбрать значения из этой таблицы в форме ColumnName, ColumnValue. Я использую SQL Server 2008, и я не был уверен, могу ли я использовать функцию PIVOT для этого. Ниже приведен упрощенный пример того, что мне нужно выполнить:Выберите данные строки как ColumnName и значение

Это то, что у меня есть:

схема стола является

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

«история» схемы таблицы является

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

Вот данные ТАБЛИЦА 1_ИСТОРИЯ

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 

Помимо обновления до версии Enterprise Edition и используя встроенные функциональные возможности отслеживания изменений, что ваше предложение для решения этой задачи?

ответ

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

Это может быть сделано с UNPIVOT функции в SQL Server:

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 

 Смежные вопросы

  • Нет связанных вопросов^_^