通过SQL

时间:2017-03-06 16:59:25

标签: sql while-loop hierarchical-data

在阅读了几篇相关文章之后,我编写了一个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循环,但我不熟悉它们。任何帮助都会非常感激!

1 个答案:

答案 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用于基于集合的操作,而不是迭代操作。