sql查詢結果本身要被使用兩次


一、問題

  查詢用戶所有的錯題數目到前端展示,要求展示的時候要有錯題的編號,從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,用戶答了兩次,都答錯了,題目表中會記錄兩條數據,此處只將該題目展示一次即可)。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM