您需要使用动态PIVOT子句才能执行此操作。
编辑:
好了,所以我做了一些玩耍,并根据下面的示例数据:
Create Table TableA
(
IDCol int,
SomeValue varchar(50)
)
Create Table TableB
(
IDCol int,
KEYCol int,
Value varchar(50)
)
Insert into TableA
Values (1, '123223')
Insert Into TableA
Values (2,'1232ff')
Insert into TableA
Values (3, '222222')
Insert Into TableB
Values(23, 1, 435)
Insert Into TableB
Values(24, 1, 436)
Insert Into TableB
Values(25, 3, 45)
Insert Into TableB
Values(26, 3, 46)
Insert Into TableB
Values(27, 3, 435)
Insert Into TableB
Values(28, 3, 437)
您可以执行以下动态SQL。
declare @sql varchar(max)
declare @pivot_list varchar(max)
declare @pivot_select varchar(max)
Select
@pivot_list = Coalesce(@Pivot_List + ', ','') + '[' + Value +']',
@Pivot_select = Coalesce(@pivot_Select, ', ','') +'IsNull([' + Value +'],'''') as [' + Value + '],'
From
(
Select distinct Value From dbo.TableB
)PivotCodes
Set @Sql = '
;With p as (
Select a.IdCol,
a.SomeValue,
b.Value
From dbo.TableA a
Left Join dbo.TableB b on a.IdCol = b.KeyCol
)
Select IdCol, SomeValue ' + Left(@pivot_select, Len(@Pivot_Select)-1) + '
From p
Pivot (Max(Value) for Value in (' + @pivot_list + '
)
)as pvt
'
exec (@sql)
这给你以下的输出:
虽然这部作品的那一刻,将是保持一个噩梦。我建议尝试在其他地方实现这些结果。即不在SQL中!
祝你好运!
我个人会改变你的设计。关键值表是一种非常困难的设计,可以有效且正确地工作。如果您确实需要键值对,那么关系数据库可能不是存储它们的最佳位置。一个noSQL数据库可能是一个更好的选择。 – HLGEM 2010-12-14 18:19:32
是的,我知道这不是一个很好的方法来解决这个问题,但我只需要这个一次性的东西,它不会在任何应用程序中实现。 – picknick 2010-12-14 19:27:00