Sql server 选择行数据作为ColumnName和Value
我有一个历史记录表,需要以ColumnName、ColumnValue的形式从该表中选择值。我使用的是SQLServer2008,我不确定是否可以使用PIVOT函数来实现这一点。下面是我需要完成的一个简化示例: 这就是我所拥有的: 该表的架构是Sql server 选择行数据作为ColumnName和Value,sql-server,sql-server-2008,pivot-table,dynamic-pivot,Sql Server,Sql Server 2008,Pivot Table,Dynamic Pivot,我有一个历史记录表,需要以ColumnName、ColumnValue的形式从该表中选择值。我使用的是SQLServer2008,我不确定是否可以使用PIVOT函数来实现这一点。下面是我需要完成的一个简化示例: 这就是我所拥有的: 该表的架构是 CREATE TABLE TABLE1 (ID INT PRIMARY KEY, NAME VARCHAR(50)) CREATE TABLE TABLE1_HISTORY( ID INT, NAME VARCHAR(50),
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))
“history”表的架构是
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
我需要将表1_历史记录中的数据提取为以下格式:
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并利用内置的更改跟踪功能外,您对完成此任务有何建议?您可以尝试使用
联合
测试数据
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
这可以通过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
是的,但是实际表中有很多列,所以我希望不必为每一列执行select语句,因为性能很差。执行计划告诉您什么?很多表格扫描?添加覆盖索引不会加快速度吗?