Вот хакерский способ сделать это, используя оконные функции, в частности ROW_NUMBER
:
WITH cteB AS (
SELECT FoodName, Remaining,
COALESCE(SUM(Remaining) OVER (ORDER BY FoodName ROWS BETWEEN UNBOUNDED PRECEDING AND PRECEDING ROW), 0) AS RemainingStart,
SUM(Remaining) OVER (ORDER BY FoodName) RemainingEnd
FROM TableB
),
cteA AS (
SELECT Name, Value, ROW_NUMBER() OVER (ORDER BY Name) rn
FROM TableA
)
SELECT
a.Name,
a.Value,
b.FoodName AS Food
FROM cteA a
LEFT JOIN cteB b
ON a.rn > b.RemainingStart AND a.rn <= b.RemainingEnd;
Демо
Идея, лежащая в основе логики, которую я использовал, состояла в том, чтобы с помощью оконных функций сгенерировать псевдопищевой порядок для каждого элемента в таблице B, который нумеруется от 0 до общего количества продуктов питания. Затем также назначьте номер строки каждому человеку в таблице A, а затем сопоставьте человека с продуктом питания, используя эту псевдопоследовательность.
Обратите внимание, что мой ответ не дается в случае, когда мы можем захотеть повторить ещечем один раз и назначить несколько продуктов питания для каждого человека.