2012-06-30 70 views
0

是否有可能在查詢執行時根據其中一列的值動態更改where子句?也就是說,我們可以說(這完全是一個例子),我有一張學生表,參加的班級,以及是否遲到。我想爲每個學生查看自上次遲到以來他們參加過的所有班級的列表。因此,查詢將是這個樣子:Postgresql不同的地方根據列值?

SELECT student, class, classdate 
FROM attendance 
WHERE classdate>(<<SOME QUERY that selects the most recent tardy for each student>>) 
ORDER BY student,classdate; 

,或者將其投入更多的編程術語來說,或許更清楚:

for studentName in (SELECT distinct(student) FROM attendance): 
    SELECT student, class, classdate 
    FROM attendance 
    WHERE classdate>(SELECT classdate 
        FROM attendance 
        WHERE tardy=true AND student=studentName 
        ORDER BY classdate DESC 
        LIMIT 1) 
    ORDER BY classdate; 

有沒有辦法使用單個查詢做到這一點,還是我需要爲每個學生做一個單獨的查詢(基本上按照上面的循環)?實際的用例更加難以解釋(它與認證記錄有關,需要查看哪些記錄),但概念上它是相同的。

回答

1

只要使用了attendance表多個別名(例如a1a2),那麼你可以參考「外」表的別名的子查詢:

SELECT student, class, classdate 
FROM attendance a1 
WHERE classdate>(SELECT classdate 
       FROM attendance a2 
       WHERE tardy=true AND a2.student=a1.student 
       ORDER BY classdate DESC 
       LIMIT 1) 
ORDER BY classdate; 
相關問題