Re: nested query problem

From: David Gauthier <davegauthierpg(at)gmail(dot)com>
To: pj(at)illuminatedcomputing(dot)com
Cc: "pgsql-generallists(dot)postgresql(dot)org" <pgsql-general(at)lists(dot)postgresql(dot)org>
Subject: Re: nested query problem
Date: 2018-09-06 21:19:45
Message-ID: CAMBRECCx83LgW-0R_PhUOkjnVoHp5pP116iR-tUZeQTRFU8CLA@mail.gmail.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-general

Wow, I take that back. I thought there were many recs with "foo" but there
wa sonly one.
When I ran this against a value that actually had multiple records, it ran
fine.

Sorry for that.
And Thanks for this query !

On Thu, Sep 6, 2018 at 5:15 PM David Gauthier <davegauthierpg(at)gmail(dot)com>
wrote:

> Not quite. This returns one value. In the actual "sqf_runs" table, there
> are many records with user_id = 'foo'. I want one line for each where the
> fse.p-erl_sub_name and fse.end_datetime values are the latest values found
> in the flow_step_events_view view where the sqf_ids match.
>
> On Thu, Sep 6, 2018 at 5:10 PM Paul Jungwirth <pj(at)illuminatedcomputing(dot)com>
> wrote:
>
>> 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

Browse pgsql-general by date

  From Date Subject
Next Message Rob Sargent 2018-09-06 22:52:59 bad url in docs
Previous Message David Gauthier 2018-09-06 21:15:53 Re: nested query problem