由于水平有限,这个问题困绕了我好久,今天终于在Csdn社区解决,高兴啊。还是Csdn强人多呀。
问题:
现在有三个数据表:
表1(user):
User_ID User_NAME Role_ID
1 zs 2
2 ls 1
表2(fieldpriv):
Role_ID Field_NAME
1 GDP
2 SHENGFEN
表3(data):
Record_ID GDP SHENGFEN
1 1000 BEIJING
2 2000 SHANGHAI
目的:
用户(user)根据其Role_ID在表2中对应的Field_NAME显示该字段对应的表3(data)中的
相应字段的数据。
比如:zs对应的Role_ID号为2,然后查找表2后知道其对应的字段为SHENGFEN,从而在其登录的页面显示表3的SHENGFEN字段数据。
即:用户zs查询后,结果为
| SHENGFEN |
------------
| BEIJING |
| SHANGHAI |
用SQL语句实现?
roy_88的解答:
--> --> (Roy)生成測試數據
set nocount on;
if not object_id('user') is null
drop table [user]
Go
Create table [user]([User_ID] int,[User_NAME] nvarchar(2),[Role_ID] int)
Insert [user]
select 1,N'zs',2 union all
select 2,N'ls',1
Go
--> --> (Roy)生成測試數據
set nocount on;
if not object_id('fieldpriv') is null
drop table fieldpriv
Go
Create table fieldpriv([Role_ID] int,[Field_NAME] nvarchar(8))
Insert fieldpriv
select 1,N'GDP' union all
select 2,N'SHENGFEN'
Go
--> --> (Roy)生成測試數據
set nocount on;
if not object_id('data') is null
drop table data
Go
Create table data([Record_ID] int,[GDP] int,[SHENGFEN] nvarchar(8))
Insert data
select 1,1000,N'BEIJING' union all
select 2,2000,N'SHANGHAI'
Go
create proc P(@userName nvarchar(2))
as
declare @sql nvarchar(1000)
select
@sql='select '+quotename(b.[Field_NAME])+' from data'
from
[user] a
join
fieldpriv b on a.[Role_ID]=b.[Role_ID]
where
a.[User_NAME]=@userName
exec(@sql)
go
--调用
exec p 'zs'
SHENGFEN
--------
BEIJING
SHANGHAI
-----------------
qianjin036a的解答:
create table [user]([User_ID] int,[User_NAME] varchar(10), Role_ID int)
insert into [user] select 1,'zs',2
insert into [user] select 2,'ls',1
create table fieldpriv(Role_ID int, Field_NAME varchar(10))
insert into fieldpriv select 1,'GDP'
insert into fieldpriv select 2,'SHENGFEN'
create table data(Record_ID int,GDP int, SHENGFEN varchar(10))
insert into data select 1, 1000 , 'BEIJING'
insert into data select 2, 2000 , 'SHANGHAI'
go
declare @searchstr varchar(1000)
declare @username varchar(10)
set @username='zs' --此处可改为别的用户,此段程序可改为函数或过程调用
set @searchstr='select '+
(select b.Field_NAME from [user] a inner join fieldpriv b on b.Role_id=a.Role_id where [user_name]=@username)
+ ' from data'
exec (@searchstr)
go
drop table [user],fieldpriv,data
----------------
真谢谢两位高人了。