Here is a simple example to give you the idea. You will likely want to do some research and improve on this split function.use tempdbgocreate table [fields] (id int, field varchar(2000))gocreate table [products] (productID int, productDesc varchar(200))goinsert [products]select 1, 'Board Analyst' union allselect 2, 'Chartmaker' union allselect 3, 'GIST' union allselect 4, 'Interlocks' union allselect 5, 'Networking'insert [Fields]select 1, 'Board Analyst' union allselect 2, 'Board Analyst | Chartmaker' union allselect 3, 'Board Analyst | Chartmaker | GIST' union allselect 4, 'Networking Tool | GIST'gocreate function dbo.splitFields (@f varchar(2000))returns @t table (fld varchar(200))asbegin declare @i int set @f = '|' + replace(replace(@f,' |', '|'),'| ', '|') + '|' select @i = charindex('|', @f, 1) while @i > 0 and @i < len(@f) begin insert @t select substring(@f, @i+1, charindex('|', @f, @i+1)-@i-1 ) set @i = charindex('|', @f, @i+1) end return endgoselect row_number() over (order by fs.id, p.productid) as rowID ,fs.id, p.productidfrom [fields] fscross apply ( select fld from dbo.splitFields(fs.field) ) finner join [products] p on p.productDesc = f.fld godrop function dbo.splitFieldsdrop table [fields]drop table [products]goOUTPUT:rowID id productid-------------------- ----------- -----------1 1 12 2 13 2 24 3 15 3 26 3 37 4 3Be One with the OptimizerTG