Исходя из того, как выглядит ваше представление данных, самое простое решение - это набор союзов.Вероятно, не самый производительный, но намного проще, чем пытаться достичь его с помощью upserts в результирующей временной таблице.
Решение кода:
select pItem.itemID,pItem.item_markup_perc,pCat.cat_itemID,pCat.cat_markup_perc,pDept.dept_itemID, pDept.dept_markup_perc
from #ProductInfo pItem
LEFT join
#ProductInfo pCat on pItem.itemID = pCat.cat_itemID
LEFT join
#ProductInfo pDept on pItem.itemID = pDept.dept_itemID
or pDept.dept_itemID = pCat.cat_itemID
WHERE pItem.itemID is not null
UNION
select pItem.itemID,pItem.item_markup_perc,pCat.cat_itemID,pCat.cat_markup_perc,pDept.dept_itemID,pDept.dept_markup_perc
from #ProductInfo pCat
LEFT join
#ProductInfo pItem on pItem.itemID = pCat.cat_itemID
LEFT join
#ProductInfo pDept on pItem.itemID = pDept.dept_itemID
or pDept.dept_itemID = pCat.cat_itemID
WHERE pCat.cat_itemID is not null
UNION
select pItem.itemID,pItem.item_markup_perc,pCat.cat_itemID,pCat.cat_markup_perc,pDept.dept_itemID,pDept.dept_markup_perc
from #ProductInfo pDept
LEFT join
#ProductInfo pCat on pDept.dept_itemID = pCat.cat_itemID
LEFT join
#ProductInfo pItem on pItem.itemID = pDept.dept_itemID
or pItem.itemID = pCat.cat_itemID
WHERE pDept.dept_itemID is not null
Результаты для приведенного выше примера дадут
itemID item_markup_perc cat_itemID cat_markup_perc dept_itemID dept_markup_perc
------------------------------------------------------------------------------------------------------------------------
2739 22 2739 77 2739 50
Я протестировал его со случайным «разбросом» данных по трем группам столбцов, и он работает нормально, помещая элементы с одинаковыми «идентификаторами» в те же строки, будут нулевые значения, если элемент не указан в спискев категории.
Как я уже сказал, не самый производительный, поэтому вам придется взглянуть на индексацию, фильтрацию и т. Д., Чтобы получить наилучшие результаты.