Re: nested query problem

From: Paul Jungwirth <pj(at)illuminatedcomputing(dot)com>
To: pgsql-general(at)lists(dot)postgresql(dot)org
Subject: Re: nested query problem
Date: 2018-09-06 21:10:10
Message-ID: 4c19a45b-8b5d-b171-a443-d86b67f81c38@illuminatedcomputing.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-general

On 09/06/2018 01:59 PM, David Gauthier wrote:
> I'm having trouble with this query...
>
> select sr.sqf_id, sr.status, fse.perl_sub_name, fse.end_datetime
>   from
>     sqf_runs sr,
>     (select perl_sub_name, end_datetime from flow_step_events_view
> where sqf_id = sr.sqf_id order by 2 limit 1) fse
>   where sr.userid='foo';
>
> ERROR:  invalid reference to FROM-clause entry for table "sr"
> LINE 4: ...atetime from flow_step_events_view where sqf_id = sr.sqf_id ...
>                                                              ^
> HINT:  There is an entry for table "sr", but it cannot be referenced
> from this part of the query.

This calls for a lateral join:

SELECT sr.sqf_id, sr.status, fse.perl_sub_name, fse.end_datetime
FROM sqf_runs sr
LEFT OUTER JOIN LATERAL (
SELECT perl_sub_name, end_datetime
FROM flow_step_events_view fsev
WHERE fsev.sqf_id = sr.sqf_id
ORDER BY 2
LIMIT 1
) fse
ON true
WHERE sr.userid = 'foo'
;

It's nearly what you had already, but `LATERAL` lets the subquery
reference columns in the other tables.

A lateral join is conceptually a lot like running your subquery in for
loop, looping over all the rows produced by the rest of the query. It
doesn't have to produce 1 row for each iteration, but saying `LIMIT 1`
ensures that here.

The `ON true` is just pro forma because you can't have a join without an
`ON` clause.

You might prefer an INNER JOIN LATERAL, depending on your needs.

--
Paul ~{:-)
pj(at)illuminatedcomputing(dot)com

In response to

Responses

Browse pgsql-general by date

  From Date Subject
Next Message Tom Lane 2018-09-06 21:11:37 Re: nested query problem
Previous Message David Gauthier 2018-09-06 20:59:37 nested query problem