Re: self referencing table.

From: David Salisbury <salisbury(at)globe(dot)gov>
To: pgsql-general(at)postgresql(dot)org
Subject: Re: self referencing table.
Date: 2012-01-18 16:57:55
Message-ID: 4F16FA13.2000607@globe.gov
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-general

On 1/18/12 9:46 AM, David Salisbury wrote:
>
>
> On 1/17/12 6:00 PM, Chris Travers wrote:
>> On Tue, Jan 17, 2012 at 4:31 PM, David Salisbury<salisbury(at)globe(dot)gov>
>> wrote:
>>>
>>> I've got a table:
>>>
>>> Taxa
>>> Column | Type
>>> ----------------+-----------------------------
>>> id | integer |
>>> parent_id | integer |
>>> taxonomic_rank | character varying(32) |
>>> latin_name | character varying(32)
>>>
>>> It's basically a self referential table, with
>>> values in the taxonomic_rank like
>>>
>>> phylum
>>> family
>>> order
>>> genus
>>> species
>>>
>>> So at any row in the table I can get all the parent
>>> information be traversing upward using the parent id.
>>>
>>> However I'm interested in only getting just genus and species
>>> when I'm given a taxa.id value. It would be a nice simple
>>> self join if the taxa.id I was given was always to a
>>> row with rank of 'species'. Problem is, grasses don't
>>> have species, so sometimes my id is pointing to a genus
>>> row instead ( the id will be to lowest rank ), so the
>>> parent is of no use.
>>
>> So basically you are just getting genus and species, why not just join
>> the table against itself? It's not like you need recursion here.
>> Something like:
>>
>> select g.latin_name as genus, s.latin_name as species
>> from "Taxa" s
>> join "Taxa" g ON s.parent_id = g.id
>> WHERE s.taxonomic_rank = 'species' AND s.id = ?
>>
>> If you want the whole taxonomic ranking, you'd probably have to do a
>> with recursive.......
>>
>> Best Wishes,
>> Chris Travers
>
> Well, that works fine if my s.id is pointing to a row that has a
> taxonomic_rank of 'species'. But that's not always the case. If
> there is no species for a plant's classification, the rank will be
> 'genus' for that s.id, so the query above would return nothing.
> Instead, for that case I'd like the query to return s.latin_name as
> genus, and
> null for species. I'm wondering if I'm missing something
> clever to do this, but I'm seeing this logic as row based iteration
> type stuff.. :(
>
> Cheers,
>
> -ds

Think I'll answer myself on this. I'll join in whatever rows I get from
the self referential query above to the base table, and include the rank column,
and then figure out some sort of post processing on the resultant view ( I hope ).

-ds

In response to

Responses

Browse pgsql-general by date

  From Date Subject
Next Message Atul Goel 2012-01-18 17:07:20 Re: On duplicate ignore
Previous Message David Salisbury 2012-01-18 16:46:32 Re: self referencing table.