Unix Technical Forum

How to do a Join Using Foreign Keys in Stored in a Database Column?

This is a discussion on How to do a Join Using Foreign Keys in Stored in a Database Column? within the SQL Server forums, part of the Microsoft SQL Server category; --> I have a database column that stores a comma delimited list of foreign keys. Would someone show me how ...


Go Back   Unix Technical Forum > Database Server Software > Microsoft SQL Server > SQL Server

FAQ Members List Calendar Search Today's Posts Mark Forums Read
  #1 (permalink)  
Old 03-01-2008, 02:53 PM
Chris
 
Posts: n/a
Default How to do a Join Using Foreign Keys in Stored in a Database Column?

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.

Digg this Post!Add Post to del.icio.usBookmark Post in TechnoratiFurl this Post!
Reply With Quote
  #2 (permalink)  
Old 03-01-2008, 02:53 PM
Hugo Kornelis
 
Posts: n/a
Default Re: How to do a Join Using Foreign Keys in Stored in a Database Column?

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
Digg this Post!Add Post to del.icio.usBookmark Post in TechnoratiFurl this Post!
Reply With Quote
  #3 (permalink)  
Old 03-01-2008, 02:54 PM
Erland Sommarskog
 
Posts: n/a
Default Re: How to do a Join Using Foreign Keys in Stored in a Database Column?

Chris (christopher.b.lewis@gmail.com) 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@sommarskog.se

Books Online for SQL Server 2005 at
http://www.microsoft.com/technet/pro...ads/books.mspx
Books Online for SQL Server 2000 at
http://www.microsoft.com/sql/prodinf...ons/books.mspx
Digg this Post!Add Post to del.icio.usBookmark Post in TechnoratiFurl this Post!
Reply With Quote
Reply


Thread Tools
Display Modes

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

vB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are On
Forum Jump


All times are GMT. The time now is 07:14 AM.


Powered by vBulletin® Version 3.6.5
Copyright ©2000 - 2008, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0
www.UnixAdminTalk.com