1

我有一个历史表,我需要从该表中以 ColumnName、ColumnValue 形式选择值。我正在使用 SQL Server 2008,但不确定是否可以使用 PIVOT 函数来完成此操作。以下是我需要完成的简化示例:

这就是我所拥有的:

该表的架构是

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))

这是来自 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

除了升级到企业版并利用内置的更改跟踪功能之外,您对完成这项任务有什么建议?

4

2 回答 2

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
于 2010-05-11T14:08:06.903 回答
1

这可以通过UNPIVOTSQL 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
于 2013-01-08T17:51:50.317 回答