Thread: Can I do this smarter?

Can I do this smarter?

From
Joost Kraaijeveld
Date:
I have three tables: customers, salesorders and invoices. Customers have
salesorders and salesorders have invoices ( child tables have foreign
key columns to their parent).

I want to get a list of all invoices with their customers. This what I
came up with:

select 
invoices.objectid,  
invoices.invoicenumber, 
invoices.invoicedate, 
(select customer from salesorders where objectid = invoices.salesorderobjectid),
(select customernumber from customers where objectid = (select customer from salesorders where objectid =
invoices.salesorderobjectid)),
(select lastname from customers where objectid = (select customer from salesorders where objectid =
invoices.salesorderobjectid))
from invoices

Can I do this smarter as the three subselects select the same customer three times and I would think that 1 time is
enough?

TIA

-- 
Groeten,

Joost Kraaijeveld
Askesis B.V.
Molukkenstraat 14
6524NB Nijmegen
tel: 024-3888063 / 06-51855277
fax: 024-3608416
web: www.askesis.nl


Re: Can I do this smarter?

From
"Aaron Bono"
Date:
On 7/13/06, Joost Kraaijeveld <J.Kraaijeveld@askesis.nl> wrote:
I have three tables: customers, salesorders and invoices. Customers have
salesorders and salesorders have invoices ( child tables have foreign
key columns to their parent).

I want to get a list of all invoices with their customers. This what I
came up with:

select
invoices.objectid,
invoices.invoicenumber,
invoices.invoicedate,
(select customer from salesorders where objectid = invoices.salesorderobjectid),
(select customernumber from customers where objectid = (select customer from salesorders where objectid = invoices.salesorderobjectid)),
(select lastname from customers where objectid = (select customer from salesorders where objectid = invoices.salesorderobjectid))
from invoices

Can I do this smarter as the three subselects select the same customer three times and I would think that 1 time is enough?

 
SELECT
   invoices.objectid,
   invoices.invoicenumber,
   invoices.invoicedate,
   salesorders.customer,
   customers.customernumber,
   customers.lastname
FROM invoices
INNER JOIN salesorders ON (
   salesorders.objectid = invoices.salesorderobjectid
)
INNER JOIN customers ON (
   customers.objectid = salesorder.customer
)

You should do INNER and OUTER  joins for connecting the tables by their foreign keys.

==================================================================
   Aaron Bono
   Aranya Software Technologies, Inc.
   http://www.aranya.com
==================================================================

Re: Can I do this smarter?

From
Joost Kraaijeveld
Date:
Hi Aaron,

On Thu, 2006-07-13 at 22:52 -0500, Aaron Bono wrote:
> SELECT
>    invoices.objectid,
>    invoices.invoicenumber,
>    invoices.invoicedate,
>    salesorders.customer,
>    customers.customernumber,
>    customers.lastname
> FROM invoices
> INNER JOIN salesorders ON (
>    salesorders.objectid = invoices.salesorderobjectid
> )
> INNER JOIN customers ON (
>    customers.objectid = salesorder.customer
> )
> 
> You should do INNER and OUTER  joins for connecting the tables by
> their foreign keys. 
Thanks for the quick (and working ;-)) response.

-- 
Groeten,

Joost Kraaijeveld
Askesis B.V.
Molukkenstraat 14
6524NB Nijmegen
tel: 024-3888063 / 06-51855277
fax: 024-3608416
web: www.askesis.nl


Re: Can I do this smarter?

From
Joost Kraaijeveld
Date:
This is clearly the "Aaron helps day" ;-)

Thanks,

-- 
Groeten,

Joost Kraaijeveld
Askesis B.V.
Molukkenstraat 14
6524NB Nijmegen
tel: 024-3888063 / 06-51855277
fax: 024-3608416
web: www.askesis.nl


Re: Can I do this smarter?

From
Aaron Bingham
Date:
Aaron Bono wrote:

> On 7/13/06, *Joost Kraaijeveld* <J.Kraaijeveld@askesis.nl 
> <mailto:J.Kraaijeveld@askesis.nl>> wrote:
>
>     I have three tables: customers, salesorders and invoices.
>     Customers have
>     salesorders and salesorders have invoices ( child tables have foreign
>     key columns to their parent).
>
>     I want to get a list of all invoices with their customers. This
>     what I
>     came up with:
>
>     select
>     invoices.objectid,
>     invoices.invoicenumber,
>     invoices.invoicedate,
>     (select customer from salesorders where objectid =
>     invoices.salesorderobjectid),
>     (select customernumber from customers where objectid = (select
>     customer from salesorders where objectid =
>     invoices.salesorderobjectid)),
>     (select lastname from customers where objectid = (select customer
>     from salesorders where objectid = invoices.salesorderobjectid))
>     from invoices
>
>     Can I do this smarter as the three subselects select the same
>     customer three times and I would think that 1 time is enough? 
>
>
>  
> SELECT
>    invoices.objectid,
>    invoices.invoicenumber,
>    invoices.invoicedate,
>    salesorders.customer,
>    customers.customernumber,
>    customers.lastname
> FROM invoices
> INNER JOIN salesorders ON (
>    salesorders.objectid = invoices.salesorderobjectid
> )
> INNER JOIN customers ON (
>    customers.objectid = salesorder.customer
> )
>
> You should do INNER and OUTER  joins for connecting the tables by 
> their foreign keys.

You can also rewirite this (IMO) more clearly thus:

SELECT  invoices.objectid,  invoices.invoicenumber,  invoices.invoicedate,  salesorders.customer,
customers.customernumber, customers.lastname
 
FROM invoices, salesorders, customers
WHERE salesorders.objectid = invoices.salesorderobjectid  AND customers.objectid = salesorder.customer;

-- 
--------------------------------------------------------------------
Aaron Bingham
Senior Software Engineer
Cenix BioScience GmbH
--------------------------------------------------------------------