【问题标题】:SQL Parent Child query - relation is defined in two tablesSQL 父子查询 - 关系在两个表中定义
【发布时间】:2015-05-24 07:49:26
【问题描述】:

我知道这里有类似的问题,但我在其中找不到我的特殊情况,所以我想问你,希望你能告诉我如何更好地做到这一点。

我有这个 SQL Fiddle
我有两张桌子:

CATEGORIES (ID, 
             NAME, 
             PARENT_ID, 
             SORT_ORDER)

还有

CATEGORY_ITEMS (ID,
                 NAME, 
                 CATEGORY_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 Fiddle 中,您可以看到我到现在为止的工作。我认为我可以通过将树结构从CATEGORIES 获取到游标中来获得我想要的东西,对于每条记录我应该从CATEGORY_ITEMS 获取它的记录,但我想知道是否有可能在没有游标的情况下做到这一点. 我承认我不擅长 SQL,但我正在努力变得更好,所以这就是我问这个问题的原因。

【问题讨论】:

    标签: sql sql-server tree


    【解决方案1】:

    试试这个:

    ;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
    

    【讨论】:

    • 非常感谢。你的回答很有帮助,解决了我的问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多