【问题标题】:subquery from SELECT reference, gets me a "cannot be referenced from this part of the query"来自 SELECT 参考的子查询,给我一个“不能从这部分查询中引用”
【发布时间】:2018-11-16 18:04:58
【问题描述】:

我正在处理这个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

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

【问题讨论】:

  • 您的第一个查询是完整的查询吗?如果没有声明别名 outercm 的位置,您能否分享完整的 SQL?我怀疑您的String index out of range 是由于您的随机日期格式。而是使用 '2012-01-09'::date 作为您的日期文字。第二个查询可能会运行,因为它看起来对我来说没问题。
  • @JNevill 对不起,没有注意到这部分已经消失了。已编辑。
  • 请检查我的答案,如果它对你有用,请接受/投票,这样它也可以帮助其他人寻求答案。请阅读:stackoverflow.com/help/someone-answers

标签: sql postgresql


【解决方案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

【讨论】:

    猜你喜欢
    • 2018-11-17
    • 2020-11-01
    • 2021-02-01
    • 2021-03-14
    • 2015-07-13
    • 2019-01-14
    • 2013-10-08
    • 1970-01-01
    • 2016-06-19
    相关资源
    最近更新 更多