From: | David W Noon <dwnoon(at)ntlworld(dot)com> |
---|---|
To: | pgsql-sql(at)postgresql(dot)org |
Subject: | Re: simple (?) join |
Date: | 2009-09-24 21:21:06 |
Message-ID: | 20090924222106.23a5c1f3@dwnoon.ntlworld.com |
Views: | Whole Thread | Raw Message | Download mbox | Resend email |
Thread: | |
Lists: | pgsql-sql |
On Thu, 24 Sep 2009 16:15:07 -0400, justin wrote about Re: [SQL] simple
(?) join:
>
>
>David W Noon wrote:On Thu, 24 Sep 2009 16:16:36 +0100, Gary Stainburn
>wrote about [SQL] simple (?) join:
>
> create table orders (
>o_id serial primary key
>...
>);
>
>create table orders_log (
>ol_id serial primary key,
>o_id int4 not null references orders(o_id),
>ol_timestamp timestamp,
>ol_user,
>);
>
>How can I select all from orders and the last (latest) entry from the
>orders_log?
>
>SELECT * FROM orders
>WHERE o_id IN (SELECT o_id FROM orders_log
> WHERE ol_timestamp = (SELECT MAX(ol_timestamp) FROM orders_log));
>
>No joins required.
>
>I don't think that is what he is requesting. I read it he also wants
>the timestamp included in the result set
That shouldn't be too much of a problem.
>A nested query
>
>Select
> orders.*,
> (SELECT MAX(ol_timestamp) FROM orders_log where orders_log.o_id =
> orders.oid)
>From orders
That won't give the desired results. I don't think the SQL parser will
even accept it.
>Still another option is using a join
>
>Select
> orders.*, ol_timestamp
> From orders
> left join (SELECT MAX(ol_timestamp), o_id FROM orders_log group by
> o_id) as JoinQuery on JoinQuery.o_id = orders.o_id
That won't give the desired results either. If you change "left" to
"inner" you will be closer though.
Both of your queries will retrieve the entire orders table with a
timestamp of some sort from the orders_log table.
>The second one should be faster
Try this for an elegant approach:
WITH maxi AS (SELECT MAX(ol_timestamp) AS ts FROM orders_log)
SELECT o.*, maxi.ts
FROM orders AS o
WHERE o.o_id IN (SELECT o_id FROM orders_log
WHERE ol_timestamp = maxi.ts);
This caches the latest timestamp in a temporary table so that it can
both appear in the result set and be used to constrain the selection
from the orders_log table.
--
Regards,
Dave [RLU #314465]
=======================================================================
david(dot)w(dot)noon(at)ntlworld(dot)com (David W Noon)
=======================================================================
From | Date | Subject | |
---|---|---|---|
Next Message | Raj Mathur | 2009-09-25 03:06:48 | Re: simple (?) join |
Previous Message | justin | 2009-09-24 20:15:07 | Re: simple (?) join |