0

我陷入了这个逻辑问题,我不知道如何继续。

我有两列:ID 和 FOLDERID。由于文件夹也可以是子文件夹,我想通过首先选择没有 folderid 的文件夹(根文件夹),然后选择它们的子文件夹来排序我的结果。所以这样我就不会有任何问题,比如“文件夹X不存在”。

在这个例子中,我无法通过 FOLDERID ASC 和/或 ID ASC 的简单订购来获得我需要的东西。

正确的结果是第三个:

  1. 首先,我得到 ID 2“Teste”文件夹,因为它的 folderid 0 = root one。
  2. 现在我想要“Controladoria”文件夹,因为folderid是2,所以需要先创建文件夹ID 2(Teste)
  3. “PCP”文件夹,需要 id 为 1 的文件夹(Controladoria)
  4. “Pasta1”文件夹,需要 id 为 3 (PCP) 的文件夹
  5. 开和开...

我已经尝试了几种在同一个表中使用多个 ORDER BY 和 JOIN/LEFT JOIN 的方法,但无法弄清楚我该如何做到这一点。

有任何想法吗?

4

4 回答 4

2

您可以使用CASE语句 to ORDER,对于您的示例,这将起作用,但听起来您可能处于递归层次结构之后,其语法将因 RDBMS 而异:

ORDER BY CASE WHEN FolderID = 0 THEN 0 ELSE 1 END, ID
于 2013-07-31T15:46:28.893 回答
2

如果您的 dbms 支持,您可以选择分层查询。在 oracle 语法中:

    select id
         , name
         , folderid
         , sys_connect_by_path ( name, '/' )    path
      from table t
connect by prior id = folderid
start with folderid = 0
  order by path
         ;
于 2013-07-31T15:53:49.943 回答
1

根据collapsar的响应,我找到了解决我的问题的 Oracle 的 CONNECT BY 等效项。

WITH n([ID], [NAME], [OWNER], [FOLDERID]) AS 
   (SELECT [ID], [NAME], [OWNER], [FOLDERID]
    FROM [RM_REPORTS_FOLDERS]
    WHERE [FOLDERID] = 0
        UNION ALL
    SELECT nplus1.[ID], nplus1.[NAME], nplus1.[OWNER], nplus1.[FOLDERID] 
    FROM [RM_REPORTS_FOLDERS] as nplus1, n
    WHERE n.[ID] = nplus1.[FOLDERID])
SELECT [ID], [NAME], [OWNER], [FOLDERID] FROM n
于 2013-07-31T16:57:38.867 回答
1

使用简单的递归查询,您可以获得这些结果。

;WITH CTE 
     AS (SELECT *, 
                1 RN 
         FROM   TABLE1 
         WHERE  FOLDERID = 0 
         UNION ALL 
         SELECT T1.*, 
                T2.RN + 1 
         FROM   TABLE1 T1 
                INNER JOIN CTE T2 
                        ON T1.FOLDERID = T2.ID) 
SELECT [ID], 
       [NAME], 
       [FOLDERID] 
FROM   CTE 
ORDER  BY RN 

使用此查询,您还可以处理多个子文件夹。

查看SQL Fiddle上的工作示例。
如果您想对递归查询有一个很好的解释,请查看此博客

于 2013-07-31T17:13:04.653 回答