Re: Get more columns from a lookup type subselect

From: negora <public(at)negora(dot)com>
To: pgsql-general(at)lists(dot)postgresql(dot)org
Subject: Re: Get more columns from a lookup type subselect
Date: 2023-03-10 11:09:39
Message-ID: 422de1d7-fe1e-3763-f29e-25ec381363d7@negora.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-general

For example, if you wanted to list book authors and the latest book of
each one, I would do something like this:

    SELECT
        author.first_name,
        author.surname,
        latest_book.title,
        latest_book.release_date
    FROM author
    CROSS JOIN LATERAL (
        SELECT book.title, book.release_date
        FROM book
        WHERE book.author_id = author.id
        ORDER BY book.release_date DESC
        LIMIT 1
    ) AS latest_book;

On 10/03/2023 11:00, Durumdara wrote:
> Dear Negora!
>
> Can you show me the usage with some short examples?
>
> Thanks for it!
>
> BR
>    dd
>
>
> negora <public(at)negora(dot)com> ezt írta (időpont: 2023. márc. 10., P, 9:43):
>
> Hi Chris:
>
> You can use a subselect in the `from` and `join` clauses. That's
> how I get multiple columns from a single subselect.
>
> If the subselect needs to use a reference from the outer scope
> (i.e. the main query) , you can use the `lateral` modifier.
>
> Best regards.
>
>
> On 10/03/2023 08:34, Durumdara wrote:
>> Dear Members!
>>
>> I use the subselects many times in my Queries to get some info
>> (Name, etc) from a subtable.
>>
>> Sometimes I have to use it to get the last element.
>>
>> select t.*,
>>    (
>>
>> select value from u join ... where ...
>>
>> order by id desc limit 1
>>
>>    ) as last_value,
>>
>> It is ok, but how can I get more values from subselect without
>> repeating the subquery?
>>
>> select t.*,
>>    (
>>
>> select value from u join ... where ...
>>
>> order by date desc limit 1
>>
>>    ) as last_value,
>>    (
>>
>> select type from u join ... where ...
>>
>> order by date desc limit 1
>>
>>    ) as last_type,
>>
>> This is not too comfortable, and may make mistakes if the join is
>> not defined properly or the date has duplicates.
>>
>> Ok, I can use WITH Query:
>>
>> with
>>   pre as ( select * from t .... )
>>   ,sub as (select pre.*, (select u.id <http://u.id> from u where
>> ... limit 1) as last_u_id
>> select  sub.*, u.value, u.type, u.nnn from sub
>> left join u on (u.id <http://u.id> = sub.last_u_id)
>>
>> But sometimes it makes the Query very long (because I have to
>> read more subselects).
>>
>> Do you know a simple method for this, like:
>>
>> select t.*,
>>    (
>>
>> select value, type, anyfield from u join ... where ...
>>
>> order by date desc limit 1
>>
>>    ) as last_value, last_type, anyfield
>>
>> ?
>>
>> Thank you for the help!
>>
>> Best regards
>> Chris
>

In response to

Browse pgsql-general by date

  From Date Subject
Next Message Tomas Pospisek 2023-03-10 15:59:35 Re: can't get psql authentication against Active Directory working
Previous Message vignesh C 2023-03-10 10:28:30 Re: Support logical replication of DDLs