分级查询的实现

本文介绍了一种通过SQL查询实现在多个数据表间进行关联并返回特定字段数据的方法。具体涉及如何根据用户角色获取相应的字段信息,并展示了一个具体的例子及两种不同的实现方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

由于水平有限,这个问题困绕了我好久,今天终于在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
----------------

真谢谢两位高人了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值