Re: Subqueries - performance and use question - Mailing list pgsql-general

From George Pavlov
Subject Re: Subqueries - performance and use question
Date
Msg-id 8C5B026B51B6854CBE88121DBF097A867DD03C@ehost010-33.exch010.intermedia.net
Whole thread Raw
In response to Subqueries - performance and use question  ("Demel, Jeff" <Jeff.Demel@JavelinDirect.com>)
Responses Re: Subqueries - performance and use question
List pgsql-general
try this approach:

SELECT
  c.id,
  c.firstname,
  c.lastname,
  a.latest_billdate
FROM
  customers c
INNER JOIN -- or LEFT if you want the NULLs
(
  SELECT
    customer_id,
    max(billdate) as latest_billdate
  FROM
    ar
) a
ON
  c.customerid = a.customerid
WHERE
  c.status = 'new';



> -----Original Message-----
> From: pgsql-general-owner@postgresql.org
> [mailto:pgsql-general-owner@postgresql.org] On Behalf Of Demel, Jeff
> Sent: Thursday, February 01, 2007 8:08 AM
> To: pgsql-general@postgresql.org
> Subject: [GENERAL] Subqueries - performance and use question
>
> I need some basic advice on how to run a subquery, or if there's a
> better way.  Let me set up a situation, and get some advice
> on it.  This
> is my first post on this list, so I hope this kind of noob question is
> ok.
>
> Say I have a table of customers and table of accounts receivable
> transactions,  There is a one-to-many relationship between the two
> (obviously a customer can have more than one purchase/transaction).
>
> I want to run a query where I pull a set of customers based on some
> parameter like, for sake of an example, where their status = new, and
> also pull the most recent billing date from the accounts receivable
> table.
>
> Here's what I came up with:
>
> SELECT customers.id, customers.firstname,
>   customers.lastname, customers.phone number,
>   (SELECT ar.billdate FROM ar
>      WHERE customers.customerid = ar.customerid
>      ORDER BY ar.billdate LIMIT 1)
>      AS lastarbilldate
> FROM customers
> WHERE customers.status = 'new';
>
> As you can see, I'm using a subquery here to get the latest billing
> date.  My question is twofold.  Is this subquery style the only way to
> get one record in a one-to-many relationship, or is there a
> way to do it
> with a join?  Also, if this is fine, is there a way to do it
> that would
> get the same results but be faster?  It may not matter on a small
> database, but if you've got millions of customers and transactions, a
> subquery can get expensive.
>
> I'm just looking for some basic direction.  I hope my fake
> example makes
> sense.
>
> I'm running PostgreSQL 8.1, on a Windows 2003 server.
>
> TIA
>
> -Jeff
> This email is intended only for the individual or entity to
> which it is addressed.  This email may contain information
> that is privileged, confidential or otherwise protected from
> disclosure. Dissemination, distribution or copying of this
> e-mail or any attachments by anyone other than the intended
> recipient, or an employee or agent responsible for delivering
> the message to the intended recipient, is prohibited. If you
> are not the intended recipient of this message or the
> employee or agent responsible for delivery of this email to
> the intended recipient, please notify the sender by replying
> to this message and then delete it from your system.  Any
> use, dissemination, distribution, or reproduction of this
> message by unintended recipients is strictly prohibited and
> may be unlawful.
>
> ---------------------------(end of
> broadcast)---------------------------
> TIP 3: Have you checked our extensive FAQ?
>
>                http://www.postgresql.org/docs/faq
>

pgsql-general by date:

Previous
From: Tom Lane
Date:
Subject: Re: How can I list the function.
Next
From: Bill Moran
Date:
Subject: Re: I "might" have found a bug on 8.2.1 win32