如何根据sql语句条件自动生成可选列表,供用户选择后执行?

/ 测试数据 数据库版本为 MS SQL SEVER 2008 R2 /

--学生基础信息表
create table TB1(name VARCHAR(20),age int,PRIMARY KEY(name)); 
insert into  TB1(name,age) values('张三',16); 
insert into  TB1(name,age) values('李四',17); 
insert into  TB1(name,age) values('王五',18); 

--每一名学员报名的课程及上课时间
create table TB2(ID  INT  IDENTITY (1,1),name VARCHAR(20),curriculum VARCHAR(20),sdate date,PRIMARY KEY(ID)); 
insert into  TB2(name,curriculum,sdate) values('张三','美术','2017-08-01'); 
insert into  TB2(name,curriculum,sdate) values('张三','英语','2017-08-02'); 
insert into  TB2(name,curriculum,sdate) values('李四','英语','2017-08-02'); 
insert into  TB2(name,curriculum,sdate) values('李四','钢琴','2017-08-03'); 
insert into  TB2(name,curriculum,sdate) values('王五','书法','2017-08-04'); 

--DROP TABLE TB1
--DROP TABLE TB2

/*

有没有一个算法或者方案可以实现 :

当获取一段文本(内容如下),其中有固定格式的标记$1,$2,


--基本语句(x可能不是直接对应的实际字段,可能会有多层嵌套生成的表集合):
select a.name ,a.age,a.curriculum,a.sdate 
from (    select tb1.name,tb1.age,TB2.curriculum,tb2.sdate 
            from TB1 inner join TB2 on TB1.name = TB2.name
            where tb1.name = $1
            ) a
where a.sdate = $2
    

程序根据文本类型的sql语句自动识别出$1可能的值集合,$2可能的值集合:
即 :$1可能的值生成集合列表1(张三、李四、王五)
:$2可能的值胜场集合列表2('2017-08-01'、'2017-08-02'、'2017-08-03'、'2017-08-04')
供前端用户选择(每个集合选择一个值后替换x、y)后执行最终的sql语句。

--根据参数列表选择后最终执行:
select a.name ,a.age,a.curriculum,a.sdate 
from (    select tb1.name,tb1.age,TB2.curriculum,tb2.sdate 
            from TB1 inner join TB2 on TB1.name = TB2.name
            where tb1.name = '张三'
            ) a
where a.sdate = '2017-08-02'
    

想要的操作:
点击一个按钮,根据配置好的固定基本语句弹出窗口含两个可下拉选择的文本框,选择参数后执行最终语句。

*/

阅读 3.6k
3 个回答

--看了一年、终于理解点你的意思了、我简述一下

--首先、有两张表、一张是 学生基础信息表、另一张是 学生详细信息表

--之后、根据两张表的数据自动生成两个新的集合、一个记录学生名字(X)、另一个记录学生上课时间(Y)

--然后、记录(X)集合的数据会呈现在前台页面、以下拉列表框的形式供用户选择、当你选择一个(X)后、其对应的上课时间(Y)也会同时传值

--最后、传的值会执行最后的操作、Over

查询出TB1的Name列,TB2的sdate列,返回两个dataTable
遍历dataTable到下拉列表的选项中
用户选择选项中的两个值
根据用户选择选项中的两个值,参数化填至x和y的地方
执行你写的将两张表联合查询的sql语句,返回的datatable经过处理后展示给用户

一个查询就搞定了,不需要子查询。

select tb1.name,tb1.age,TB2.curriculum,tb2.sdate from TB1 inner join TB2 on TB1.name = TB2.name
where (tb1.name = @name or @name = '') and (sdate = @date or @data = '')
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进