Re: Return t/f on existence of a join

Поиск
Список
Период
Сортировка
От Erik Jones
Тема Re: Return t/f on existence of a join
Дата
Msg-id D1192EEA-FFF9-4809-B7ED-583703AD60B3@myemma.com
обсуждение исходный текст
Ответ на Return t/f on existence of a join  (Madison Kelly <linux@alteeve.com>)
Ответы Solved! Was (Return t/f on existence of a join)  (Madison Kelly <linux@alteeve.com>)
Список pgsql-general
On Sep 21, 2007, at 2:17 PM, Madison Kelly wrote:

> ... Or something like that. :)
>
>   Sorry for so many questions! I have another "how do I create this
> query?" question, if it's okay.
>
>   I've got three tables; 'foo', 'bar' and 'baz'.
>
>   In 'foo' I've got 'foo_id' which is a PK. I've also got a bunch of
> other info, but in essence this is the "parent" table that all others
> reference in some way.
>
>   In 'bar' I've got 'bar_id' which is also a PK. I also have
> 'bar_foo_id' which is a FK pointing to 'foo' -> 'foo_id', to show what
> 'foo' row it (primarily) belongs to.
>
>   Lastly, I've got a table called 'baz' which has 'baz_id'. In it,
> there
> are just two columns;
>
> - 'baz_foo_id' which is a FK pointing to 'foo' -> 'foo_id'.
> - 'baz_bar_id' which is a FK pointing to 'bar' -> 'bar_id'.
>
>   This last table, 'baz' is used as a way for saying 'bar *also*
> belongs
> to a given 'foo' row,
>
>   So now my question;
>
>   I want to create a query that will allow me to say "show me all
> 'foo'
> rows and tell me if a specific 'baz_id' belongs to it". Normally, I
> would do this:
>
> SELECT foo_id FROM foo;
> (for each returned row)
> {
>     # Where '$foo_id' is the current 'foo_id' and '$bar_id' is
>     # the specific/static 'bar_id' we are checking.
>     SELECT COUNT(*) FROM baz z, bar r WHERE baz_foo_id=$foo_id AND
> baz_bar_id=$bar_id;
>     ( if count > 0 ) { # TRUE } else { # FALSE }
> }
>
>   This is pretty inefficient, obviously. How could I create a query
> that
> returned a TRUE/FALSE column that checks if there is a 'baz' record
> for
> a specified 'bar_id' in all 'foo_id's in one query?
>
>   I hope this isn't too muddy. I think part of my problem is I am
> having
> trouble even visualizing my question...
>
>   Thanks as always!
>
> Madi

*Not tested*  If this isn't quite it, then it should at least get you
close

SELECT foo.foo_id, CASE WHEN baz.foo_id IS NULL THEN FALSE ELSE TRUE
as has_baz
FROM foo
    LEFT JOIN baz ON (foo.foo_id=baz.baz_foo_id AND baz.baz_bar_id=$bar_id)


Erik Jones

Software Developer | Emma®
erik@myemma.com
800.595.4401 or 615.292.5888
615.292.0777 (fax)

Emma helps organizations everywhere communicate & market in style.
Visit us online at http://www.myemma.com



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

Предыдущее
От: Madison Kelly
Дата:
Сообщение: Return t/f on existence of a join
Следующее
От: Alex Vinogradovs
Дата:
Сообщение: SPI shared memory ?