Re: Querying multiple tables - Mailing list pgsql-novice

From Michael Glaesemann
Subject Re: Querying multiple tables
Date
Msg-id BD47F02A-C8D5-4978-A18B-BDCF45250878@seespotcode.net
Whole thread Raw
In response to Querying multiple tables  (Paul Malherbe <paul@tartan.co.za>)
Responses Re: Querying multiple tables
List pgsql-novice
On Aug 1, 2007, at 7:33 , Paul Malherbe wrote:

> 1) Owner Table - rcaowm - having own_code, owm_name
> 2) Tenant Table - rcatnm - having tnm_code (owner's code), tnm_acno
> (tenant's account number), tnm_name
> 3) Owner Transactions - rcaowt - having owt_code (owner's code),
> owt_date, owt_value
> 4) Tenant Transactions - rcatnt - having tnt_code (owner's code),
> tnt_acno (tenant's account number), tnt_date, tnt_value
>
> I want to produced a query giving the following data:
>
> Owner_Name, Tenant_Name, Sum_Owner_Transaction_Value,
> Sum_Tenant_Transaction_Value
>
> Is there any way this can be achieved with a single select statement??

Probably. However, it's hard to say with certainty as you've been
inconsistent with your column naming. It's often best to include the
actual table definitions (possibly with irrelevant columns removed),
so people can see what you're dealing with.

This is what I think you have:

CREATE TABLE rcaowm
(
     own_code TEXT PRIMARY KEY
     , owm_name TEXT NOT NULL UNIQUE
);

CREATE TABLE rcatnm
(
     tnm_acno TEXT PRIMARY KEY
     , tnm_name TEXT NOT NULL UNIQUE
     , tnm_code TEXT NOT NULL REFERENCES rcaown (own_code)
);

CREATE TABLE rcaowt
(
     owt_code TEXT REFERENCES rcaown (own_code)
     , owt_date DATE NOT NULL
     , owt_value NUMERIC NOT NULL
);

CREATE TABLE rcatnt
(
     tnt_code TEXT NOT NULL REFERENCES rcaowm (own_code)
     , tnt_acno TEXT NOT NULL REFERENCES rcatnm (tnm_acno)
     , tnt_date DATE NOT NULL
     , tnt_value NUMERIC NOT NULL
);

What are the primary keys on the rcatnt and rcaowt tables?

SELECT owm_name AS "Owner_Name"
     , tnm_name AS "Tenant_Name"
     , sum(owt_value) AS "Sum_Owner_Transaction_Value"
     , sum(tnt_value) AS "Sum_Tenant_Transaction_Value"
FROM rcaowm
JOIN rcaowt ON (own_code = owt_code)
JOIN rcatnt ON (own_code = tnt_code)
JOIN (
      SELECT tnm_acno, tnm_name
      FROM rcatnm
     ) AS tenants ON (tnm_acno = tnt_acno)
GROUP BY own_name, tnm_name;

I've made an assumption that the owner you want is the one specified
in the rcatnt table rather than the rcatnm table. Can a tenant have a
transaction with an owner other than the one specified in the rcatnm
table? I ask because if not, there's no reason to include the
tnt_code column in rcatnt as it can be derived through the rcatnm table.

As an aside, I'd highly recommend changing your table and column
names to something easier to read. For example:

CREATE TABLE owners
(
     owner_code TEXT PRIMARY KEY
     , owner_name TEXT NOT NULL UNIQUE
);

CREATE TABLE tenants
(
     tenant_account_number TEXT PRIMARY KEY
     , tenant_name TEXT NOT NULL UNIQUE
     , owner_code TEXT NOT NULL REFERENCES owners (owner_code)
);

CREATE TABLE owner_transactions
(
     owner_code TEXT REFERENCES owners (owner_code)
     , owner_transaction_date DATE NOT NULL
     , owner_transaction_value NUMERIC NOT NULL
);

CREATE TABLE tenant_transactions
(
     owner_code TEXT NOT NULL REFERENCES owners (owner_code)
     , tenant_account_number TEXT NOT NULL REFERENCES tenants
(tenant_account_number)
     , tenant_transaction_date DATE NOT NULL
     , tenant_transaction_value NUMERIC NOT NULL
);

This makes the query much less cryptic:

SELECT owner_name AS "Owner_Name"
     , tenant_name AS "Tenant_Name"
     , sum(owner_transaction_value) AS "Sum_Owner_Transaction_Value"
     , sum(tenant_transaction_value) AS "Sum_Tenant_Transaction_Value"
FROM owners
JOIN owner_transactions USING (owner_code)
JOIN tenant_transactions USING (owner_code)
JOIN (
      SELECT tenant_account_number, tenant_name
      FROM tenants
     ) AS tenants USING (tenant_account_number)
GROUP BY owner_name, tenant_name;

You'll thank yourself in the future when you try to read your code :)

Hope this helps.

Michael Glaesemann
grzm seespotcode net




pgsql-novice by date:

Previous
From: Paul Malherbe
Date:
Subject: Querying multiple tables
Next
From: Paul Malherbe
Date:
Subject: Re: Querying multiple tables