sql查询结果本身要被使用两次

时间:2022-09-16 12:47:39

一、问题

  查询用户所有的错题数目到前端展示,要求展示的时候要有错题的编号,从1开始递增。如果删除了第5题,则将后面的题编号均向前挪。

二、分析

  错题是在用户每次做题过程中插入到错题表中的,或者将题目推送表中“错题标识字段”置1,我们没有必要在表中维护一个编号位,因为该编号位除了展示并无其他用途,如果在表中维护的话肯定会造成很多问题。

  使用with as将查询的信息内容查询出并暂存,在后面的查询中会多次用到。

  参考了一些文章,说with as可以将其下标明的信息进行暂存,然后在该sql中的其他位置作为结果集进行引用,这样只进行一次查询。

with b as(    
SELECT ( SELECT D .CONTENT_HTML         FROM MIC_PAPER_PROBLEMS D      WHERE D .tm_id = pm.tm_id ) questionTitle, 
       ( SELECT P .ANSWER_HTML         FROM MIC_PAPER_PROBLEMS P      WHERE P .TM_ID = pm.tm_id ) rightAns,
        pm. ID pushId,
        PM.tm_id questionId, 
        PM.USER_ANSWER yourAnswer        
FROM MIC_TD_EXERCISE_PUSH_PROBLEM pm, MIC_TD_EXERCISE_USER_PUSH ph    
WHERE pm.push_id = ph. ID AND ph.USER_ID = ? AND ph.SUBJECT_ID = ?    and PM.IS_CORRECT = 2 
order by PH.PUSH_TIME,PM.CREATE_TIME 
)
select rownum seq, b.* 
from b
where b.pushId in (select min(b.pushId) from b  group by b.QUESTIONID)

这样在oracle将as中的内容查询出来之后,命名为b,然后执行最下面的select查询,其中where条件中的无关子查询是为了保证用户对同一道题的错题只显示一个(比如,题目a,用户答了两次,都答错了,题目表中会记录两条数据,此处只将该题目展示一次即可)。