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 ...
| |||||||
| FAQ | Members List | Calendar | Search | Today's Posts | Mark Forums Read |
| ||||
| 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. |
| |||
| 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 |
| ||||
| 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 |