求一个高难度SQL语句,高手进,高分出

wushangjimo 2014-07-03 03:42:28
先说需求
有一下三个基本信息表:用户表(Tuser)、项目表(TProject)、资质表(TDistinction)

有两个关系表:用户资质关系表(UserDis)、项目资质关系表(ProjectDis) ,都是多对多的关系
用户参加某个项目的条件是,用户必须拥有项目要求的所有资质,并且资质的等级不能低于项目要求的等级。

SQL语句要求:给出一个用户的ID,查出他参与的所有项目;或者给出一个项目ID,查出所有参与这个项目的用户

测试数据:
---项目表
create table Tproject(id number(5),name varchar2(100));
insert into Tproject values(10,'项目一');
insert into Tproject values(11,'项目二');

----用户表
create table Tuser(id number(5),name varchar2(64));
insert into Tuser values('110','甲用户');
insert into Tuser values('112','乙用户');
insert into Tuser values('114','丙用户');

---资质表
create table Tdistinction(id number(3),name varchar2(64));
insert into Tdistinction values(210,'A资质');
insert into Tdistinction values(211,'B资质');
insert into Tdistinction values(212,'C资质');
insert into Tdistinction values(213,'D资质');
insert into Tdistinction values(214,'E资质');

----项目资质关系表
create table ProjectDis(project_id number(5),dis_id number(3),lev number(1));
insert into ProjectDis values(10,210,3);
insert into ProjectDis values(10,212,2);
insert into ProjectDis values(11,211,3);
insert into ProjectDis values(11,212,1);
insert into ProjectDis values(11,213,2);

----用户资质关系表
create table UserDis(user_id number(5),dis_id number(3),lev number(1));
insert into UserDis values(110,210,1);
insert into UserDis values(110,211,2);
insert into UserDis values(110,212,1);
insert into UserDis values(112,210,1);
insert into UserDis values(112,212,3);
insert into UserDis values(114,211,1);
insert into UserDis values(114,212,1);
insert into UserDis values(114,213,1);
insert into UserDis values(114,214,2);

大神们赶紧出手,想要用一个SQL查询出来,不要过程和自定义函数
...全文
185 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
wushangjimo 2014-07-04
  • 打赏
  • 举报
回复
引用 4 楼 yinan9 的回复:
[quote=引用 3 楼 wushangjimo 的回复:] [quote=引用 1 楼 yinan9 的回复:] 楼主的示例数据没有符合的项目和用户。如下适当的改了下114用户的用户资质数据,可以返回。 如需查找特定的用户或者项目,在sql最后加一个and条件即可。
不好意思,是我没写明白,0/1/2/3 分别代表 特级/一级/二级/三级,也就是说数越小级别越高,我先研究一下你给的SQL[/quote] 没关系的,只要改动一个条件就可以了。 ud.lev >= pd.lev 改成 ud.lev <= pd.lev[/quote] 我看了一下你的sql,能够满足我的要求,非常感谢。
yinan9 2014-07-04
  • 打赏
  • 举报
回复


SELECT *
FROM tuser u, tproject p
WHERE (SELECT COUNT (1)
FROM ProjectDis pd INNER JOIN UserDis ud ON pd.dis_id = ud.dis_id
WHERE pd.project_id = p.id
AND ud.user_id = u.id
AND ud.lev <= pd.lev) = (SELECT COUNT (1)
FROM ProjectDis
WHERE project_id = p.id);


原来数据的执行结果

yinan9 2014-07-04
  • 打赏
  • 举报
回复
引用 3 楼 wushangjimo 的回复:
[quote=引用 1 楼 yinan9 的回复:] 楼主的示例数据没有符合的项目和用户。如下适当的改了下114用户的用户资质数据,可以返回。 如需查找特定的用户或者项目,在sql最后加一个and条件即可。
不好意思,是我没写明白,0/1/2/3 分别代表 特级/一级/二级/三级,也就是说数越小级别越高,我先研究一下你给的SQL[/quote] 没关系的,只要改动一个条件就可以了。 ud.lev >= pd.lev 改成 ud.lev <= pd.lev
wushangjimo 2014-07-04
  • 打赏
  • 举报
回复
引用 1 楼 yinan9 的回复:
楼主的示例数据没有符合的项目和用户。如下适当的改了下114用户的用户资质数据,可以返回。 如需查找特定的用户或者项目,在sql最后加一个and条件即可。
不好意思,是我没写明白,0/1/2/3 分别代表 特级/一级/二级/三级,也就是说数越小级别越高,我先研究一下你给的SQL
yinan9 2014-07-03
  • 打赏
  • 举报
回复

附上截图,由于公司的数据库不支持中文,所以这里把示例数据改成英文的了
yinan9 2014-07-03
  • 打赏
  • 举报
回复


SELECT *
  FROM tuser u, tproject p
 WHERE (SELECT COUNT (1)
          FROM ProjectDis pd INNER JOIN UserDis ud ON pd.dis_id = ud.dis_id
         WHERE     pd.project_id = p.id
               AND ud.user_id = u.id
               AND ud.lev >= pd.lev) = (SELECT COUNT (1)
                                          FROM ProjectDis
                                         WHERE project_id = p.id);
楼主的示例数据没有符合的项目和用户。如下适当的改了下114用户的用户资质数据,可以返回。 如需查找特定的用户或者项目,在sql最后加一个and条件即可。

insert into UserDis values(114,211,3);
insert into UserDis values(114,212,3);
insert into UserDis values(114,213,3);
insert into UserDis values(114,214,3);

3,491

社区成员

发帖
与我相关
我的任务
社区描述
Oracle 高级技术相关讨论专区
社区管理员
  • 高级技术社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧