Sql 在子查询中将列值用作列名
我正在使用一个遗留数据库,它有一个表,其中包含来自其他表的字段名 所以我有这个结构:Sql 在子查询中将列值用作列名,sql,sql-server,sql-server-2008,tsql,unpivot,Sql,Sql Server,Sql Server 2008,Tsql,Unpivot,我正在使用一个遗留数据库,它有一个表,其中包含来自其他表的字段名 所以我有这个结构: Field_ID | Field_Name ********************* 1 | Col1 2 | Col2 3 | Col3 4 | Col4 我需要为给定的用户提取一个字段元数据列表以及该字段的值。因此,我需要: Field_ID | Field_Name | Value 1 | Col1 | ValueOfCol1onADiffTable 2 | Col2 | Va
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
我想在子查询中使用字段\ u Name来提取该值,但不知道如何让SQL将字段\ u Name作为子查询中的一列进行计算
比如说:
select
Field_ID
,Field_Name
,(SELECT f.Field_Name from tblUsers u
where u.User_ID = @userId) as value
from
dbo.tblFields f
但这只是返回值列中的字段名称,而不是它的值
我是否需要将子查询放在单独的函数中并对其求值?或者某种动态SQL?在SQL server中,这需要动态SQL和UNPIVOT表示法。
表有列,而不是字段。根据您的需要立即执行或执行类似操作RDBMS@jarlh-明白。我没有编写原始模式,也没有更改它的选项。在本例中,列的名称是字段\ u Name,etc@Randy-MSSQL,sql server 2016我相信什么味道和版本的sql?演示程序按预期工作,但有一个缺点。。。我简化了我的例子。现实世界的版本需要在两个不同的表中查找“值”tblUsers和tblUsers_程序_历史_细节。我可以加入它们,但sql会抱怨,因为它上面有两个用户id实例我正在使用的动态sql语句:select Field\u id,case当DB\u Field\u Name为null时,则Field\u Name else DB\u Field\u Name结束为FieldName,Field\u Name,DB\u Field\u Name,正确的\u标签,FieldCategory,dbo.tblbographic_字段f join SELECT*from SELECT*from tblUsers u internal join tblUsers_program_history_详细信息h on u.User_ID=h.User_ID,其中h.User_ID=1 src unpivot字段值在t.field=DB_字段上“+@cols+”up t中_Name@SamR. 您还可以查看相关列的tblUsers和tblUsers的并集\u程序\u历史\u详细信息您应该在此处显式地放置列列表,而不是*:select*from tblUsers u inner join tblUsers\u程序\u历史\u详细信息表格不必具有相同的并集列吗?
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)