pg.ddx.io  pgsql-sql@postgresql.org mailing list archive  
help / color / mirror / Atom feed
From: David W Noon <dwnoon@ntlworld.com>
To: pgsql-sql@postgresql.org
Subject: Re: simple (?) join
Date: Thu, 24 Sep 2009 22:21:06 +0100
Message-ID: <20090924222106.23a5c1f3@dwnoon.ntlworld.com> (raw)
In-Reply-To: <4ABBD34B.9080600@emproshunts.com>
References: <200909241616.36933.gary.stainburn@ringways.co.uk>
	<20090924194629.44bc236f@dwnoon.ntlworld.com>
	<4ABBD34B.9080600@emproshunts.com>

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.w.noon@ntlworld.com (David W Noon)
=======================================================================



view thread (25+ messages)  latest in thread

Message-ID: <20090924222106.23a5c1f3@dwnoon.ntlworld.com>
Permalink:  ../20090924222106.23a5c1f3@dwnoon.ntlworld.com/
Also on:    postgresql.org/message-id/20090924222106.23a5c1f3@dwnoon.ntlworld.com

 · 

reply

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Reply to all the recipients using the --to and --cc options:
  reply via email

  To: pgsql-sql@postgresql.org
  Cc: dwnoon@ntlworld.com
  Subject: Re: simple (?) join
  In-Reply-To: <20090924222106.23a5c1f3@dwnoon.ntlworld.com>

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

This inbox is served by DDX for PostgreSQL; see mirroring instructions
for how to clone and mirror all data and code used for this inbox