在阅读了几篇相关文章之后,我编写了一个CTE查询来迭代我的分层数据。这是场景:
在安全表中,有菜单ID,标题,父菜单ID和隐身。我编写了循环的逻辑并显示特定子菜单的路径。由于这是一个旨在仅显示特定用户可以访问的菜单项的查询,因此我需要能够消除任何菜单项及其隐藏字段设置为true的子菜单。以下是那些通过视觉效果更好理解的人的例子。
MenuID Title ParentMenuID Invisibility
MAIN Main Menu 0
LEVEL1 Management MAIN 1
LEVEL2 Operation MGMT LEVEL1 0
在提供的方案中,查询只返回主菜单,因为用户无法访问其下的任何内容。尽管LEVEL2在技术上对用户可见,但它的父菜单是不可访问的,因此它继承了该值。
我想要的是能够针对我的CTE查询编写逻辑,说“只返回查询中的值,直到隐形为1,然后忽略所有其他值”。但是,我很难知道如何做到这一点。我知道可以编写WHILE循环,但我不熟悉它们。任何帮助都会非常感激!
答案 0 :(得分:1)
这是一个简单的递归CTE。
WITH CTE AS
(
SELECT MenuID, Title, 1 as Level
FROM TABLE_NAME_YOU_DIDNT_SAY
WHERE ParentMenuID is null and Invisiblity = 0
UNION ALL
SELECT X.MenuID, X.Title, CTE.Level+1 as Level
FROM CTE
JOIN TABLE_NAME_YOU_DIDNT_SAY AS X ON X.ParentMenuID = CTE.MENUID AND X.Invisiblitiy = 0
)
SELECT *
FROM CTE
ORDER BY Level ASC
请不要使用"循环"或" while-loop"再次靠近SQL。 :)
SQL用于基于集合的操作,而不是迭代操作。