2012-06-30 99 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; 
相关问题