SQL父子查询关系在两个表中定义

SQL父子查询关系在两个表中定义,sql,sql-server,tree,Sql,Sql Server,Tree,我知道这里也有类似的问题,但我找不到我在这些问题上的特殊情况,所以我想问你,我希望你能建议我如何更好地去做 我有这个。 我有两张桌子: CATEGORIES (ID, NAME, PARENT_ID, SORT_ORDER) 及 这两个表在某种程度上是我真实数据库模式的恢复(我不可能更改它)。在我的真实数据库模式中,这些类别可以定义基于特定日期时间值的有效集。 我想知道是否可以通过一个查询返回如下结果 |

我知道这里也有类似的问题,但我找不到我在这些问题上的特殊情况,所以我想问你,我希望你能建议我如何更好地去做

我有这个。
我有两张桌子:

CATEGORIES (ID, 
             NAME, 
             PARENT_ID, 
             SORT_ORDER)

这两个表在某种程度上是我真实数据库模式的恢复(我不可能更改它)。在我的真实数据库模式中,这些类别可以定义基于特定日期时间值的有效集。 我想知道是否可以通过一个查询返回如下结果

|           NAME    | 
|-------------------|
|Category 1         |   
|Item 1 Category 1  |  
|Item 2 Category 1  |   
|Category 1.1       | 
|Item 1 Category 1.1|    
|Item 2 Category 1.1|      
|Category 1.2       |      
| Category 1.2.1    |       
|     Category 2    |   
|Item 1 Category 2  |   
|Item 2 Category 2  |    
|   Category 2.1    |       
|   Category 2.2    |        
|     Category 3    |    
|   Category 3.1    |        
|   Category 3.2    | 
在SQL小提琴中,您可以看到我迄今为止的工作。我想我可以通过将
类别
中的树状结构放入游标来获得我想要的,对于每个记录,我应该从
类别(ITEMS
)中获取它的记录,但我想知道是否有可能不使用游标来实现它。 我承认我并不擅长SQL,但我正在努力变得更好,这就是我问这个问题的原因。

试试这个:

;WITH CTE(ID, NAME, PARENT_ID, SORT_ORDER, [Level], ord)  AS (
    SELECT c.ID, CONVERT(nvarchar(100), c.NAME), 
        c.PARENT_ID, c.SORT_ORDER, 1 [level], 
        CONVERT(nvarchar(255), RIGHT('0000' + CONVERT(nvarchar(255), c.ID), 4)) AS ord
    FROM CATEGORIES c
    WHERE c.PARENT_ID IS NULL
    UNION ALL
    SELECT c.ID, CONVERT(nvarchar(100), REPLICATE('  ', [Level]) + c.NAME), 
        c.PARENT_ID, c.SORT_ORDER, CTE.[Level] + 1, 
        CONVERT(nvarchar(255),RIGHT('0000' + CONVERT(nvarchar(255), CTE.ID), 4) + RIGHT('0000' + CONVERT(nvarchar(255), c.ID), 4)) AS ord
    FROM CATEGORIES c
        JOIN CTE ON c.PARENT_ID = CTE.ID
    WHERE c.PARENT_ID IS NOT NULL)
SELECT NAME
FROM (
    SELECT NAME, ord, 1 As ord2
    FROM CTE
    UNION ALL
    SELECT ci.NAME, c.ord, 2 + ci.SORT_ORDER
    FROM CATEGORY_ITEMS ci 
    JOIN CTE c ON ci.CATEGORY_ID = c.ID) dt
ORDER BY ord, ord2
为此:

NAME
Category 1
Item 1 Category 1
Item 2 Category 1
  Category 1.1
Item 1 Category 1.1
Item 2 Category 1.1
  Category 1.2
    Category 1.2.1
Category 2
Item 1 Category 2
Item 2 Category 2
  Category 2.1
  Category 2.2
Category 3
  Category 3.1
  Category 3.2

非常感谢你。你的回答很有帮助,它解决了我的问题。
NAME
Category 1
Item 1 Category 1
Item 2 Category 1
  Category 1.1
Item 1 Category 1.1
Item 2 Category 1.1
  Category 1.2
    Category 1.2.1
Category 2
Item 1 Category 2
Item 2 Category 2
  Category 2.1
  Category 2.2
Category 3
  Category 3.1
  Category 3.2