У меня есть ситуация, когда мне нужно иметь возможность видеть, находится ли данный человек в иерархии пользователя/менеджера.
Мне нужно иметь возможность сделать это для набора пользователей в соответствии с набором правил (не беспокойтесь об этом, просто чтобы дать немного контекста)
В идеале я хотел бы использовать рекурсивный CTE внутри коррелированного подзапроса exists в предложении where.
Но это создает массу проблем..
- Я не думаю, что вы вообще можете использовать CTE в подзапросе.
- Я использую SQL 2005 с режимом совместимости 80, поэтому я не могу использовать перекрестное применение... поэтому для меня нет параметров столбца в UDF :-(
Я думаю, что я пытаюсь сделать следующее:
WITH UserHierarchy(UserId, ManagerId)
AS
(
--Anchor Definition
SELECT [UserId], [ManagerId] FROM [Users] WHERE [ManagerId] = [Rules].[RuleAddedByUserId] -- this needs to bind to an outer query....
UNION ALL
--Recursive Member definiation
SELECT [Users].[UserId], [Users].[ManagerId] FROM [Users]
INNER JOIN [UserHierarchy] ON [Users].[ManagerId] = [UserHierarchy].[UserId]
WHERE [Users].[UserId] <> [Users].[ManagerId] --don't recurse if the anchor definition matches itself (to avoid an infinate loop).
)
Есть ли способ сделать определение привязки динамическим в режиме совместимости 80? Или альтернативный подход?
EXISTS, ноWITH, который используется для построения рекурсивных запросов, не может использоваться в подзапросах, и поэтому вы задаете этот вопрос. Это правильно? Предположим, вам разрешено иметьWITHв подзапросах, и поэтому вы можете построить коррелированный рекурсивный подзапрос. Зачем вам нужна рекурсия, если только якорная часть коррелирует с внешним запросом? Если бы якорь возвращал строки, этого было бы достаточно, чтобы предикат EXISTS вернулtrue, и аналогично дляfalse. - person Andriy M   schedule 01.12.2011WITH. Это, в свою очередь, означает, что вы можете иметь коррелированный подзапрос в форме простогоSELECT [UserId], [ManagerId] FROM [Users] WHERE [ManagerId] = [Rules].[RuleAddedByUserId]. (ИлиSELECT * FROM [Users] WHERE [ManagerId] = [Rules].[RuleAddedByUserId], так как фактический список столбцов не имеет значения для предиката EXISTS.) - person Andriy M   schedule 01.12.2011