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 <davegauthie...@gmail.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 <p...@illuminatedcomputing.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              ~{:-)
>> p...@illuminatedcomputing.com
>>
>>

Reply via email to