SELECT引用的子查询,使我得到“无法从查询的这一部分引用”

时间:2018-11-16 18:04:59

标签: sql postgresql

我正在处理这个question 我知道简单的汇总答案,但我想尽办法用子查询来挑战自己。

SELECT outercm.surname, outercm.firstname, outercm.memid, subq.starttime
FROM cd.members outercm,
(
SELECT cm.memid, cb.starttime
from cd.members cm
JOIN cd.bookings cb ON cb.memid = cm.memid
WHERE cm.memid = outercm.memid
AND
DATE(starttime ) >= '01-09-2012'
ORDER BY cb.starttime
LIMIT 1
  ) as subq

我收到此错误:

  

有一个用于表“ outercm”的条目,但是不能被引用   从查询的这一部分开始。

我还尝试了FROM的子查询:

SELECT outercm.surname, outercm.firstname, outercm.memid, 
(
  SELECT cb.starttime
  from cd.members cm
  JOIN cd.bookings cb ON cb.memid = cm.memid
  WHERE cm.memid = outercm.memid
  AND
  DATE(starttime ) >= '01-09-2012'
  ORDER BY cb.starttime
  LIMIT 1 
) 
FROM cd.members outercm

我收到此消息:

  

java.lang.StringIndexOutOfBoundsException:字符串索引超出范围:-1

我不确定,何时以及如何在内部和外部查询之间引用。 感谢您的帮助

1 个答案:

答案 0 :(得分:1)

在Postgres中,DISTINCT ON可用于获取每组最高/最低行的结果,在您的示例中为“首次预订”。与GROUP BY + MIN()之类的其他选项相比,或在相关子查询中使用LIMIT时,这通常效率很高。

SELECT DISTINCT ON ( cm.memid ) cm.surname, 
   --get the first among memid  
                                cm.firstname, 
                                cm.memid, 
                                cb.starttime 
FROM   cd.members cm 
       join cd.bookings cb 
         ON cb.memid = cm.memid 
            AND cb.starttime >= TIMESTAMP '2012-09-01' 
ORDER  BY cm.memid,     --for each memid 
          cb.starttime; --that has the earliest date