under any case you can use belowSELECT f.id,f.name,b.Bar_name,IDENTITY(int,1,1) AS RowIDINTO #TempFROM (SELECT id, name, Bar_id1 as Bar_id FROM Foo UNION ALL SELECT id, name, Bar_id2 as Bar_id FROM Foo UNION ALL SELECT id, name, Bar_id3 as Bar_id FROM Foo UNION ALL .... SELECT id, name, Bar_id8 as Bar_id FROM Foo )fINNER JOIN Bar bON b.Bar_id=f.Bar_idSELECT id,name,MAX(CASE WHEN Seq=1 THEN Bar_name ELSE NULL END) AS Bar_name1,MAX(CASE WHEN Seq=2 THEN Bar_name ELSE NULL END) AS Bar_name2,.......MAX(CASE WHEN Seq=8 THEN Bar_name ELSE NULL END) AS Bar_name8FROM(SELECT (SELECT COUNT(*) FROM #Temp WHERE id=id and name =t.name AND RowID<=t.RowID) AS Seq,*FROM #Temp t)rGROUP BY id,nameDROP TABLE #Temp