Re: SELECT issue with references to different tables

Поиск
Список
Период
Сортировка
От David Johnston
Тема Re: SELECT issue with references to different tables
Дата
Msg-id 18A20594-5E7F-4C81-B43B-85C61454C981@yahoo.com
обсуждение исходный текст
Ответ на SELECT issue with references to different tables  (Alexander Reichstadt <lxr@mac.com>)
Список pgsql-general
On Jun 2, 2012, at 14:50, Alexander Reichstadt <lxr@mac.com> wrote:

> Hi,
>
> I have a query I cannot figure out in postgres or actually in any other way than using the client front end, which I
wouldprefer not to do. 
>
> So, I have 4 tables
>
> pets
> persons
> companies
> pets_reference
>
> pets have owners, the owner at any point in time is either a persons or a company, never both at the same time.
>
> So, the pets_reference table has the fields:
>
> refid_pets        matching table pets, field id
> refid_persons    matching table persons, field id
> refid_companies    matching table companies, field id
> ownersince        which is a timestamp
>
> A pet owner can change to persons A, resulting in a record in pets_reference connecting pet and person with a
timestamp,setting refid_companies to zero and refid_persons to person A's record's id value. If the owner changes to
someother person B, then another record is added to pets_reference. Or if the owner for that pet changes to a company,
thena new record is added with refid_persons being zero and refid_companies being the id value of that companies id
fieldvalue. So at the end of the day pets_reference results in a history of owners. 
>
> Now, the problem is with displaying a table with pets and only their current owners. I can't figure out two things.
> For one it seems I would need to somehow build a query which uses an if-then branch to check if companies is zero or
personsis zero to ensure to either reference a persons or a companies record. 
> The second issue is that I only need the max(ownersince) record, because I only need the current owner and not past
owners.
>
> I toyed around with DISTINCT max(ownersince) and GROUP BY, but it only results in errors. I am not the SQL guru, I
knowmy way around so far and am learning, but this is kind of another league and I can't really show any good results
I'vecome up with so far. Please, can someone help? 
>
> Thanks
> Alex
>
>

While you can solve the problem as structured have you considered an "entity" table that is a super-type of both person
andcompany?  The entity id would then be the foreign key. 

For you immediate problem you have to perform a UNION query.  The first sub-query will output records where personid is
notnull and the second sub-query will output records where companyid is not null. 

If you are using 8.4 or above after the union you can use a window function (rank) on the ordered ownersince date and
thenin an outer query filter so that only rank=1 records are kept. 

David J.

В списке pgsql-general по дате отправления:

Предыдущее
От: Chris Angelico
Дата:
Сообщение: Re: SELECT issue with references to different tables
Следующее
От: Mark Morgan Lloyd
Дата:
Сообщение: Re: timestamps, formatting, and internals