Please note that in my queries here you can replace the OptimalFood table OptimalFood your function of returning to the F () rowset (if I understand correctly).
WITH PersonFood (Name, Food) AS ( SELECT 'Abner', 'Apple' UNION ALL SELECT 'Beth', 'Banana' UNION ALL SELECT 'Beth', 'Peach' UNION ALL SELECT 'Carlos', 'Grape' UNION ALL SELECT 'Carlos', 'Kiwi' UNION ALL SELECT 'Carlos', 'Strawberry' UNION ALL SELECT 'Delilah', 'Passionfruit' ), OptimalFood (Priority, Food) AS ( SELECT 1, 'Kiwi' UNION ALL SELECT 2, 'Grape' UNION ALL SELECT 3, 'Banana' UNION ALL SELECT 4, 'Strawberry' UNION ALL SELECT 5, 'Apple' UNION ALL SELECT 6, 'Peach' ), Choices AS ( SELECT Selector = Row_Number() OVER (PARTITION BY F.Name ORDER BY Coalesce(O.Priority, 2147483647)), F.Name, Food = Coalesce(O.Food, '<None>') FROM PersonFood F LEFT JOIN OptimalFood O ON F.Food = O.Food ) SELECT Name, Food FROM Choices WHERE Selector = 1;
If you have a table with all the people listed once already, this might be the best way:
WITH PersonFood (Name, Food) AS ( SELECT 'Abner', 'Apple' UNION ALL SELECT 'Beth', 'Banana' UNION ALL SELECT 'Beth', 'Peach' UNION ALL SELECT 'Carlos', 'Grape' UNION ALL SELECT 'Carlos', 'Kiwi' UNION ALL SELECT 'Carlos', 'Strawberry' UNION ALL SELECT 'Delilah', 'Passionfruit' ), OptimalFood (Priority, Food) AS ( SELECT 1, 'Kiwi' UNION ALL SELECT 2, 'Grape' UNION ALL SELECT 3, 'Banana' UNION ALL SELECT 4, 'Strawberry' UNION ALL SELECT 5, 'Apple' UNION ALL SELECT 6, 'Peach' ), Person AS ( SELECT DISTINCT Name FROM PersonFood ) SELECT P.Name, Food = Coalesce(X.Food, '<None>') FROM Person P OUTER APPLY ( SELECT TOP 1 O.Food FROM PersonFood F INNER JOIN OptimalFood O ON F.Food = O.Food WHERE P.Name = F.Name ORDER BY O.Priority ) X;
I would expect that in all these cases you are actually using numeric keys, not varchar strings. I hope so. :)