【问题标题】:SELECT from alias used in sub query从子查询中使用的别名中选择
【发布时间】:2018-01-31 09:38:33
【问题描述】:

我在下面的代码中定义了一个名为 a.onhold_endtime 的字段。我想将该值作为整个 SELECT 语句的一部分返回,但是当我包含它时,别名 a.* 无法识别。它返回错误“错误:缺少表“a”的 FROM 子句条目”

Select distinct 
woas.workorderid,
a.onhold_endtime,

(SELECT 
(SELECT count(*) AS work_hours
FROM   generate_series (b.onhold_starttime
                  , a.onhold_endtime - interval '1h'
                  , interval '1h') h
WHERE  EXTRACT(ISODOW FROM h) < 6
AND    h::time >= '08:00'
AND    h::time <= '18:00') 
FROM (
     SELECT DISTINCT woas.workorderid, 
        timestamp 'epoch' + 
        nth_value(wos.endtime,1)  OVER(PARTITION BY woas.workorderid ORDER BY wos.endtime ASC
                         ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING)
        /1000 * INTERVAL '1 second' as onhold_endtime from wo_status_info wos
    LEFT JOIN wo_assessment woas ON woas.assessmentid = wos.assessmentid
    WHERE tmp.workorderid = woas.workorderid AND wos.statusid = 1 AND wos.nextstatusid = 2
) as a
LEFT JOIN (
     SELECT DISTINCT woas.workorderid, 
        timestamp 'epoch' + 
        nth_value(wos.endtime,1)  OVER(PARTITION BY woas.workorderid ORDER BY wos.endtime ASC
                         ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING)
        /1000 * INTERVAL '1 second' as onhold_starttime from wo_status_info wos
    LEFT JOIN wo_assessment woas ON woas.assessmentid = wos.assessmentid
    WHERE 
        (wos.statusid = 2 AND wos.nextstatusid <> 2)
) as b ON a.workorderid = b.workorderid) AS onhold_difference1

FROM wo_assessment as tmp
LEFT JOIN wo_assessment woas ON tmp.assessmentid = woas.assessmentid
LEFT JOIN wo_status_info wos ON woas.assessmentid = wos.assessmentid
ORDER BY woas.workorderid ASC

有没有一种方法可以构造代码,以便我可以使用“a”别名包含项目?

使用简化代码更新 我在一个别名为“a”的子查询中定义了一个名为“onhold_endtime”的值。我想在主 SELECT 语句中返回值 a.onhold_endtime

Select distinct 
woas.workorderid,
a.onhold_endtime,

(SELECT 
        (SELECT count(*)) 
        FROM (
             SELECT DISTINCT woas.workorderid, 
                nth_value(wos.endtime,1)  OVER(PARTITION BY woas.workorderid ORDER BY wos.endtime ASC
                ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING)
            as onhold_endtime from wo_status_info wos
            WHERE y.workorderid = woas.workorderid AND wos.statusid = 1 AND wos.nextstatusid = 2
        ) as a
        LEFT JOIN (
             SELECT DISTINCT woas.workorderid, 
                nth_value(wos.endtime,1)  OVER(PARTITION BY woas.workorderid ORDER BY wos.endtime ASC
                ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING)
                as onhold_starttime from wo_status_info wos
            WHERE 
                (wos.statusid = 2 AND wos.nextstatusid <> 2)
        ) as b ON a.workorderid = b.workorderid) AS x

FROM wo_assessment as y
LEFT JOIN wo_assessment woas ON y.assessmentid = woas.assessmentid

【问题讨论】:

  • 谢谢,但是我在语法上很吃力。如果您能提供我的代码示例,将不胜感激。
  • 请将您的代码剪切成一些有问题的简短示例 - 我会帮助您
  • 谢谢,我已经尽我所能简化了代码,同时仍然让它处于工作状态:)

标签: postgresql select subquery alias


【解决方案1】:

简而言之 - 您可以在相关子查询中使用外部查询别名:

t=# select o.oid, (select o.datname||'*') from pg_database o limit 1;
  oid  | ?column?
-------+-----------
 13505 | postgres*
(1 row)

但不能反其道而行之:

t=# select b.*, (select o.datname||'*') b from pg_database o limit 1;
ERROR:  missing FROM-clause entry for table "b"
LINE 1: select b.*, (select o.datname||'*') b from pg_database o lim...

            ^

最接近预期的是:

t=# select oid,b.* from pg_database o, LATERAL (select o.datname||'*') b limit 1;
  oid  | ?column?
-------+-----------
 13505 | postgres*
(1 row)

【讨论】:

    猜你喜欢
    • 2011-12-21
    • 1970-01-01
    • 1970-01-01
    • 2012-02-13
    • 2019-04-04
    • 1970-01-01
    • 2015-02-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多