Grp: (Grp_ID,Parent_ID,Grp_Name,...)
Tov: (T_Art,Grp_ID,...)
Main: (ART,NAME...)
(Указал только то, что нужно для понимания задачи, ессесно)
По таблице Grp строится дерево групп товара.
В таблице Tov - соответствия товара товарным группам.
Таблица Main - актуальность товара. То есть реально есть только те артикулы, которые есть в этой таблице.
Задача - запросом отфильтровать лишние ветви дерева.
Лишние - это те, в которые не входит ни один артикул, и у которых при этом нету потомков.
Первая попытка была делать это перебором, но 3000 групп и 28000 артикулов - это 5 минут на моей машинке,
а на рабочих - все 15.
В итоге я, не очень хорошо зная SQL за пару часов родил вот это:
- Код: Выделить всё
SELECT DISTINCT G.*
FROM (Grp G INNER JOIN Tov T ON T.Grp_ID = G.Grp_ID) INNER JOIN Main M ON M.ART=T.T_Art
ORDER BY G.Grp_Name
UNION
SELECT DISTINCT G.*
FROM Grp G INNER JOIN Grp G1 ON G.Grp_ID=G1.Parent_ID
ORDER BY G.Grp_Name
И все бы замечательно, но после этого я понял, что условия усложняются. ((
Первое условие - отфильтровать те группы, в которые не входит ни один артикул сохраняется,
А вот второе - у группы не должно быть также "пустых" потомков.
Иначе те группы, которые до фильтрации имели только пустых потомков, после фильтрации сами становятся "пустыми".
Соответственно вот это:
- Код: Выделить всё
SELECT DISTINCT G.*
FROM (Grp G INNER JOIN Tov T ON T.Grp_ID = G.Grp_ID) INNER JOIN Main M ON M.ART=T.T_Art
ORDER BY G.Grp_Name
сохраняется.
А вот вторая часть:
- Код: Выделить всё
SELECT DISTINCT G.*
FROM Grp G INNER JOIN Grp G1 ON G.Grp_ID=G1.Parent_ID
ORDER BY G.Grp_Name
Нуждается в переделке. Нужно, чтобы выбирались только те группы, которые имеют "непустых" потомков..
Хелп плиз. Моск уже кипит (((