在postgresql查询中,同一个表上有两次内部连接

uqdfh47h  于 2021-07-26  发布在  Java
关注(0)|答案(1)|浏览(378)

我正在努力处理我的postgresql数据库上的以下查询,它最初是用条令查询生成器构建的(但这在这里不相关)。
我有一个名为“course”的实体,它在“log”表中有多条记录。
记录 log.resumeComplete 有一个日期和记录 log.activated 有个约会。
在这一个查询中,我希望拉出具有 log.activated 早于x和a的日期 log.resumeComplete 比你老。重要的是,一些“课程”记录没有相应的 log.resumeComplete 记录在日志表中。
有没有一种方法可以通过一个查询获得这些信息?

SELECT s0_.slug AS slug, s0_.status AS status, a2_.time AS resumeTime
FROM Course s0_ 
    INNER JOIN Log a1_ ON (a1_.course_id = s0_.id) 
    INNER JOIN Log a2_ ON (s0_.id = a2_.course_id AND a2_.type = 'log.resumeComplete')
WHERE s0_.status = 'active' 
    AND s0_.currentsss = '72' 
    AND a1_.type = 'log.activated'
    AND a1_.time < '2020-05-31 14:25:31'   
    AND a2_.time IS NULL OR a2_.time < '2020-07-11 14:25:31'
ORDER BY s0_.id ASC;
ctrmrzij

ctrmrzij1#

此查询应该可以工作(未得到fiddle/测试集):
改变:
内部连接=>左连接
第一个联接条件上移
或“在所有的透水条件下工作,使它们无用。”()必修的
可能是隐式类型转换(时间<字符串),不利于索引。没有纠正,没有小提琴
sql语句

SELECT s0_.slug AS slug, s0_.status AS status, a2_.time AS resumeTime
FROM Course s0_ 
    INNER JOIN Log a1_ ON (a1_.course_id = s0_.id and AND a1_.type = 'log.activated')  
    left JOIN Log a2_ ON (a2_.course_id = s0_.id AND a2_.type = 'log.resumeComplete')
WHERE s0_.status = 'active' 
    AND s0_.currentsss = '72' 

    AND a1_.time < '2020-05-31 14:25:31'   
    AND (a2_.time IS NULL OR a2_.time < '2020-07-11 14:25:31') -- this type of comparison might cause an implicet conversion of a2_.time to varchar. bad
ORDER BY s0_.id ASC;

相关问题