SQL 父子查询 - 关系在两个表中定义
SQL Parent Child query - relation is defined in two tables
我知道这里也有类似的问题,但我在里面找不到我的具体情况,所以想问问你,希望你能指点一下如何做比较好。
我有这个SQL Fiddle
.
我有两个表:
CATEGORIES (ID,
NAME,
PARENT_ID,
SORT_ORDER)
和
CATEGORY_ITEMS (ID,
NAME,
CATEGORY_ID,
SORT_ORDER)
这两个表不知何故是我的真实数据库架构的恢复(我无法更改它)。在我的真实数据库模式中,这些类别可以定义基于特定日期时间值的有效集合。
我想知道是否可以通过一个查询获得如下所示的 return 结果。
| 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 |
在SQLFiddle你可以看到我到现在为止的作品。我认为我可以通过从 CATEGORIES
获取树结构到游标中来获得我想要的东西,对于每条记录我应该从 CATEGORY_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
我知道这里也有类似的问题,但我在里面找不到我的具体情况,所以想问问你,希望你能指点一下如何做比较好。
我有这个SQL Fiddle
.
我有两个表:
CATEGORIES (ID,
NAME,
PARENT_ID,
SORT_ORDER)
和
CATEGORY_ITEMS (ID,
NAME,
CATEGORY_ID,
SORT_ORDER)
这两个表不知何故是我的真实数据库架构的恢复(我无法更改它)。在我的真实数据库模式中,这些类别可以定义基于特定日期时间值的有效集合。 我想知道是否可以通过一个查询获得如下所示的 return 结果。
| 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 |
在SQLFiddle你可以看到我到现在为止的作品。我认为我可以通过从 CATEGORIES
获取树结构到游标中来获得我想要的东西,对于每条记录我应该从 CATEGORY_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