在子查询中使用列值作为列名
Using column value as column name in subquery
我正在使用一个遗留数据库,该数据库有一个 table,其中包含来自其他 table 的字段名称。
所以我有这个结构:
Field_ID | Field_Name
*********************
1 | Col1
2 | Col2
3 | Col3
4 | Col4
我需要为给定用户提取此字段元数据的列表以及该字段的值。所以我需要:
Field_ID | Field_Name | Value
1 | Col1 | ValueOfCol1onADiffTable
2 | Col2 | ValueOfCol2onADiffTable
3 | Col3 | ValueOfCol3onADiffTable
4 | Col4 | ValueOfCol4onADiffTable
我想在子查询中使用 Field_Name 来提取该值,但无法弄清楚如何让 SQL 评估 Field_Name
作为子查询。
所以像这样:
select
Field_ID
,Field_Name
,(SELECT f.Field_Name from tblUsers u
where u.User_ID = @userId) as value
from
dbo.tblFields f
但是values栏里的那个只是returns Field_Name
,不是它的值。
我是否需要将子查询放在一个单独的函数中并对其求值?或者某种动态 SQL?
在 SQL 服务器中,这需要动态 SQL 和 UNPIVOT 表示法。
see working demo
create table tblFields (Field_ID int ,Field_Name varchar(10));
insert into tblFields values
(1,'Col1')
,(2,'Col2')
,(3,'Col3')
,(4,'Col4');
declare @userId int
set @userId=1
create table tblUsers (User_ID int, col1 varchar(10),col2 varchar(10));
insert into tblUsers values
(1, 10,100),
(2,20,200);
declare @collist varchar(max)
declare @sqlquery varchar(max)
select @collist= COALESCE(@collist + ', ', '') + Field_Name
from dbo.tblFields
where exists (
select * from sys.columns c join sys.tables t
on c.object_id=t.object_id and t.name='tblUsers'
and c.name =Field_Name)
select @sqlquery=
' select Field_ID ,Field_Name, value '+
' from dbo.tblFields f Join '+
' ( select * from '+
'( select * '+
' from tblUsers u '+
' where u.User_ID = '+ cast(@userId as varchar(max)) +
' ) src '+
'unpivot ( Value for field in ('+ @collist+')) up )t'+
' on t.field =Field_Name'
exec(@sqlquery)
我正在使用一个遗留数据库,该数据库有一个 table,其中包含来自其他 table 的字段名称。
所以我有这个结构:
Field_ID | Field_Name
*********************
1 | Col1
2 | Col2
3 | Col3
4 | Col4
我需要为给定用户提取此字段元数据的列表以及该字段的值。所以我需要:
Field_ID | Field_Name | Value
1 | Col1 | ValueOfCol1onADiffTable
2 | Col2 | ValueOfCol2onADiffTable
3 | Col3 | ValueOfCol3onADiffTable
4 | Col4 | ValueOfCol4onADiffTable
我想在子查询中使用 Field_Name 来提取该值,但无法弄清楚如何让 SQL 评估 Field_Name
作为子查询。
所以像这样:
select
Field_ID
,Field_Name
,(SELECT f.Field_Name from tblUsers u
where u.User_ID = @userId) as value
from
dbo.tblFields f
但是values栏里的那个只是returns Field_Name
,不是它的值。
我是否需要将子查询放在一个单独的函数中并对其求值?或者某种动态 SQL?
在 SQL 服务器中,这需要动态 SQL 和 UNPIVOT 表示法。 see working demo
create table tblFields (Field_ID int ,Field_Name varchar(10));
insert into tblFields values
(1,'Col1')
,(2,'Col2')
,(3,'Col3')
,(4,'Col4');
declare @userId int
set @userId=1
create table tblUsers (User_ID int, col1 varchar(10),col2 varchar(10));
insert into tblUsers values
(1, 10,100),
(2,20,200);
declare @collist varchar(max)
declare @sqlquery varchar(max)
select @collist= COALESCE(@collist + ', ', '') + Field_Name
from dbo.tblFields
where exists (
select * from sys.columns c join sys.tables t
on c.object_id=t.object_id and t.name='tblUsers'
and c.name =Field_Name)
select @sqlquery=
' select Field_ID ,Field_Name, value '+
' from dbo.tblFields f Join '+
' ( select * from '+
'( select * '+
' from tblUsers u '+
' where u.User_ID = '+ cast(@userId as varchar(max)) +
' ) src '+
'unpivot ( Value for field in ('+ @collist+')) up )t'+
' on t.field =Field_Name'
exec(@sqlquery)