1.问题描述:
test表中有ID(人员编号),A(考核标准),B(实际得分),C(课程编号)四个字段,一个ID可能会有多个科目的评分,如果一个ID中存在A=B,则合格,求合格的人员编号。
2.需求分析:
要得到的结果为:
ID 是否合格
1011 合格
1012 合格
1013 合格
1014 不合格
1015 合格
如果直接用decode()函数,则会出现同一id有合格和不合格的成绩,错误
故合格产品满足以下两个条件:(1)ID不能重复—》distinct (2)同一id存在A=B
3.解答过程:
(1)查出合格的
selectdistinctid,'合格' PJ fromtestwhereidin(selectidfromtestwhere a=b)
(2)查出不合格的
selectdistinctid,'不合格' PJ fromtestwhereidnotin(selectidfromtestwhere a=b)
(3)使用union联接
selectdistinctid,'合格' PJ fromtestwhereidin(selectidfromtestwhere a=b)union
selectdistinctid,'不合格' PJ fromtestwhereidnotin(selectidfromtestwhere a=b);
4. SQL代码:
selectdistinctid,'合格' PJ fromtestwhereidin(selectidfromtestwhere a=b)union
selectdistinctid,'不合格' PJ fromtestwhereidnotin(selectidfromtestwhere a=b);
或者
SELECT 'yes',ID FROM TEST WHERE A=BGROUP BY ID ORDER BY ID
SELECT 'no',ID FROM TEST WHERE ID NOT IN (SELECT ID FROM TEST WHERE A=B) GROUP BY ID ORDER BY ID
5.联想扩展:
假设只有A,B两列数据,如果存在A=B,则显示匹配成功(即根据A来判断)
select t3.xx,decode(t3.xx,t3.yy,'success','fail')匹配情况from
(select*from(selectdistinct A xx fromtest) t1leftjoin
(selectdistinct A yy fromtestwhere A=B) t2 on t1.xx=t2.yy) t3