Welcome to dbForumz.com!
FAQFAQ    SearchSearch      ProfileProfile    Private MessagesPrivate Messages   Log inLog in

How to do a Join Using Foreign Keys in Stored in a Databas..

 
   Database Forums (Home) -> General Discussions RSS
Next:  getting text intead of script output  
Author Message
Chris

External


Since: Apr 17, 2007
Posts: 1



(Msg. 1) Posted: Tue Apr 17, 2007 2:55 pm
Post subject: How to do a Join Using Foreign Keys in Stored in a Database Column?
Archived from groups: comp>databases>ms-sqlserver (more info?)

I have a database column that stores a comma delimited list of foreign
keys. Would someone show me how to do a join using the values from a
list stored within a record?

For example, a record in tbl_cds.genre_id might have a value of "2,
5, 6" corresponding to genre_ids 2 , 5 and 6. I want to join
tbl_cds.genre_id to tbl_genre.genre_id using the values in that data
field.

It seems I need a loop like this:
SELECT * FROM tbl_cds
WHERE
Begin Loop
tbl_cds.genre_id[i] = tbl_genre.genre_id
End Loop.

Would someone give me the correct syntax?
Is there an alternative method that would create less overhead?

Sorry for such a novice post.

 >> Stay informed about: How to do a Join Using Foreign Keys in Stored in a Databas.. 
Back to top
Login to vote
Hugo Kornelis

External


Since: Jan 31, 2006
Posts: 335



(Msg. 2) Posted: Wed Apr 18, 2007 12:34 am
Post subject: Re: How to do a Join Using Foreign Keys in Stored in a Database Column? [Login to view extended thread Info.]
Archived from groups: per prev. post (more info?)

On 17 Apr 2007 14:55:36 -0700, Chris wrote:

>I have a database column that stores a comma delimited list of foreign
>keys. Would someone show me how to do a join using the values from a
>list stored within a record?
>
>For example, a record in tbl_cds.genre_id might have a value of "2,
>5, 6" corresponding to genre_ids 2 , 5 and 6. I want to join
>tbl_cds.genre_id to tbl_genre.genre_id using the values in that data
>field.
>
>It seems I need a loop like this:
>SELECT * FROM tbl_cds
>WHERE
>Begin Loop
>tbl_cds.genre_id[i] = tbl_genre.genre_id
>End Loop.
>
>Would someone give me the correct syntax?
>Is there an alternative method that would create less overhead?
>
>Sorry for such a novice post.

Hi Chris,

You can't. And that's because the database design volates one of the
basic principles of databases - you store a single value in a column.

If a CD can belong to three genres, you'll have to add a table like
this:

CREATE TABLE CDGenres
(CD_ID int NOT NULL,
Genre_ID int NOT NULL,
PRIMARY KEY (CD_ID, Genre_ID),
FOREIGN KEY (CD_ID) REFERENCES tbl_cds(CD_ID),
FOREIGN KEY (Genre_ID) REFERENCES Genres(Genre_ID)
);

If you don't have a master table of all genres, then you can leave out
the last foreign key constraint.

--
Hugo Kornelis, SQL Server MVP
My SQL Server blog: http://sqlblog.com/blogs/hugo_kornelis

 >> Stay informed about: How to do a Join Using Foreign Keys in Stored in a Databas.. 
Back to top
Login to vote
Erland Sommarskog2

External


Since: May 30, 2004
Posts: 1649



(Msg. 3) Posted: Wed Apr 18, 2007 10:22 pm
Post subject: Re: How to do a Join Using Foreign Keys in Stored in a Database Column? [Login to view extended thread Info.]
Archived from groups: per prev. post (more info?)

Chris ( ) writes:
> I have a database column that stores a comma delimited list of foreign
> keys. Would someone show me how to do a join using the values from a
> list stored within a record?
>
> For example, a record in tbl_cds.genre_id might have a value of "2,
> 5, 6" corresponding to genre_ids 2 , 5 and 6. I want to join
> tbl_cds.genre_id to tbl_genre.genre_id using the values in that data
> field.
>
> It seems I need a loop like this:
> SELECT * FROM tbl_cds
> WHERE
> Begin Loop
> tbl_cds.genre_id[i] = tbl_genre.genre_id
> End Loop.
>
> Would someone give me the correct syntax?
> Is there an alternative method that would create less overhead?

As Hugo said, you are in desperate need of a redesign.

On SQL 2005 you can nevertheless do:

SELECT *
FROM tbl_cds c
OUTER APPLY list_to_table(c.genre_id) l
JOIN tbl_genre g ON l.num = g.genre_id

where list_to_table is a table-valued function that unpacks the
comma-separated list into a table. See
http://www.sommarskog.se/arrays-in-sql.html for examples of such functions.


--
Erland Sommarskog, SQL Server MVP, esquel.DeleteThis@sommarskog.se

Books Online for SQL Server 2005 at
http://www.microsoft.com/technet/prodtechnol/sql/2005/downloads/books.mspx
Books Online for SQL Server 2000 at
http://www.microsoft.com/sql/prodinfo/previousversions/books.mspx
 >> Stay informed about: How to do a Join Using Foreign Keys in Stored in a Databas.. 
Back to top
Login to vote
Display posts from previous:   
   Database Forums (Home) -> General Discussions All times are: Pacific Time (US & Canada)
Page 1 of 1

 
You can post new topics in this forum
You can reply to topics in this forum
You can edit your posts in this forum
You can delete your posts in this forum
You can vote in polls in this forum



[ Contact us | Terms of Service/Privacy Policy ]