Re: One to many query question
От | Chad Thompson |
---|---|
Тема | Re: One to many query question |
Дата | |
Msg-id | 008201c356e1$9245bca0$32021aac@chad обсуждение исходный текст |
Ответ на | One to many query question (Dave Dribin <dave-ml@dribin.org>) |
Список | pgsql-sql |
> On Wed, Jul 30, 2003 at 01:11:35PM -0700, Eric Clark wrote: > > On Wed, 2003-07-30 at 12:35, Dave Dribin wrote: > > > CREATE TABLE cd ( > > > id integer unique, > > > artist varchar(25), > > > title varchar(25) > > > ); > > > > > > CREATE TABLE cd_genres ( > > > cd_id integer, > > > genre varchar(25) > > > ); > > > > I think you've got this backwards. There is no advantage in the above > > table's over simply having a genre varchar(25) in the cd table. > > > > You really want: > > > > CREATE TABLE genre ( > > genre_id serial, > > genre varchar(25) > > ); > > > > CREATE TABLE cd ( > > cd_id integer unique, > > artist varchar(25), > > title varchar(25), > > genre_id varchar(25) references genre (genre_id) > > ); > > This doesn't allow multiple genre's per CD, though, does it? A CD > can only have 1 genre_id. I would like the ability to have multiple > genres, in which case a third table is necessary: > > CREATE TABLE cd_genres ( > cd_id integer, > genre_id integer > ); > > cd_id references cd.id and genre_id references genre.genre_id. > > This still requires the complex LEFT JOIN query from my first post, > too, I think, *plus* an extra join between cd_genres and genre. > > -Dave What you may be looking for is a not exists subselect. Im not sure if this quite fits your example.. but maybe it will give you some ideas... SELECT cd.*, rock.genre AS rock, jazz.genre AS jazz, electronic.genre AS electronic FROM cd LEFT JOIN cd_genres jazz ON (cd.id = jazz.cd_id AND jazz.genre = 'Jazz') LEFT JOIN cd_genres electronic ON (cd.id= electronic.cd_id AND electronic.genre = 'Electronic'); WHERE NOT EXISTS (SELECT cd.id FROM cd join cd_genres rockON (cd.id = rock.cd_id AND rock.genre = 'Rock')) This is quite fast in postgres unless configured wrong.. be sure to join your subselect to your outer query. Hope that helps Chad
В списке pgsql-sql по дате отправления: