如何以特定方式显示(递归)数据集?
How to display (recursive) data-set in a particular manner?
我的大脑今天可能无法正常工作...但我正在尝试以特定方式安排数据集。更容易表达我的意思。
我有这样的数据集:
CREATE TABLE #EXAMPLE (
ID CHAR(11)
, ORDER_ID INT
, PARENT_ORDER_ID INT
);
INSERT INTO #EXAMPLE VALUES
('27KJKR8K3TP', 19517, 0)
, ('27KJKR8K3TP', 10615, 0)
, ('27KJKR8K3TP', 83364, 19517)
, ('27KJKR8K3TP', 96671, 10615)
, ('TXCMK9757JT', 92645, 0)
, ('TXCMK9757JT', 60924, 92645);
SELECT * FROM #EXAMPLE;
DROP TABLE #EXAMPLE;
PARENT_ORDER_ID 字段引用给定 ID 上的其他订单。例如。 ID TXCMK9757JT 有订单 60924,它是 92645 的子订单,在 ID 上是一个单独的订单。我需要这个数据集的排列方式是这样的:
CREATE TABLE #EXAMPLE (
ID CHAR(11)
, ORDER_ID INT
, CHILD_ORDER_ID INT
);
INSERT INTO #EXAMPLE VALUES
('27KJKR8K3TP', 19517, 19517)
, ('27KJKR8K3TP', 19517, 83364)
, ('27KJKR8K3TP', 10615, 10615)
, ('27KJKR8K3TP', 10615, 96671)
--, ('27KJKR8K3TP', 83364, 83364)
--, ('27KJKR8K3TP', 96671, 96671)
, ('TXCMK9757JT', 92645, 92645)
, ('TXCMK9757JT', 92645, 60924)
--, ('TXCMK9757JT', 60924, 60924)
;
SELECT * FROM #EXAMPLE;
DROP TABLE #EXAMPLE;
在数据集的这种排列中,代替 PARENT_ORDER_ID 字段的是 CHILD_ORDER_ID,它基本上列出了属于给定 ORDER_ID 的每个 ORDER_ID,包括本身。我最终希望 CHILD_ORDER_ID 字段成为数据集的键,只有唯一值(这就是为什么我注释掉了只包含自己的 CHILD_ORDER_IDs 的原因,因为它们有已经包含它们的父订单 ID)。
任何有关如何实现所描述的数据集转换的建议,我们将不胜感激!我已经尝试过递归 CTE 和不同的连接语句,但我并没有完全得到我想要的。谢谢!
你可以先尝试使用CTE递归,然后你会得到一个显示所有Id
层级的结果,然后使用CASE WHEN
判断逻辑。
;WITH CTE AS (
SELECT ID,ORDER_ID,PARENT_ORDER_ID
FROM #EXAMPLE
WHERE PARENT_ORDER_ID = 0
UNION ALL
SELECT c.Id,e.ORDER_ID,e.PARENT_ORDER_ID
FROM CTE c
INNER JOIN #EXAMPLE e
ON c.ORDER_ID = e.PARENT_ORDER_ID AND c.Id = e.Id
)
SELECT ID,
(CASE WHEN PARENT_ORDER_ID = 0 THEN ORDER_ID ELSE PARENT_ORDER_ID END) ORDER_ID,
ORDER_ID CHILD_ORDER_ID
FROM CTE
ORDER BY ID
我的大脑今天可能无法正常工作...但我正在尝试以特定方式安排数据集。更容易表达我的意思。
我有这样的数据集:
CREATE TABLE #EXAMPLE (
ID CHAR(11)
, ORDER_ID INT
, PARENT_ORDER_ID INT
);
INSERT INTO #EXAMPLE VALUES
('27KJKR8K3TP', 19517, 0)
, ('27KJKR8K3TP', 10615, 0)
, ('27KJKR8K3TP', 83364, 19517)
, ('27KJKR8K3TP', 96671, 10615)
, ('TXCMK9757JT', 92645, 0)
, ('TXCMK9757JT', 60924, 92645);
SELECT * FROM #EXAMPLE;
DROP TABLE #EXAMPLE;
PARENT_ORDER_ID 字段引用给定 ID 上的其他订单。例如。 ID TXCMK9757JT 有订单 60924,它是 92645 的子订单,在 ID 上是一个单独的订单。我需要这个数据集的排列方式是这样的:
CREATE TABLE #EXAMPLE (
ID CHAR(11)
, ORDER_ID INT
, CHILD_ORDER_ID INT
);
INSERT INTO #EXAMPLE VALUES
('27KJKR8K3TP', 19517, 19517)
, ('27KJKR8K3TP', 19517, 83364)
, ('27KJKR8K3TP', 10615, 10615)
, ('27KJKR8K3TP', 10615, 96671)
--, ('27KJKR8K3TP', 83364, 83364)
--, ('27KJKR8K3TP', 96671, 96671)
, ('TXCMK9757JT', 92645, 92645)
, ('TXCMK9757JT', 92645, 60924)
--, ('TXCMK9757JT', 60924, 60924)
;
SELECT * FROM #EXAMPLE;
DROP TABLE #EXAMPLE;
在数据集的这种排列中,代替 PARENT_ORDER_ID 字段的是 CHILD_ORDER_ID,它基本上列出了属于给定 ORDER_ID 的每个 ORDER_ID,包括本身。我最终希望 CHILD_ORDER_ID 字段成为数据集的键,只有唯一值(这就是为什么我注释掉了只包含自己的 CHILD_ORDER_IDs 的原因,因为它们有已经包含它们的父订单 ID)。
任何有关如何实现所描述的数据集转换的建议,我们将不胜感激!我已经尝试过递归 CTE 和不同的连接语句,但我并没有完全得到我想要的。谢谢!
你可以先尝试使用CTE递归,然后你会得到一个显示所有Id
层级的结果,然后使用CASE WHEN
判断逻辑。
;WITH CTE AS (
SELECT ID,ORDER_ID,PARENT_ORDER_ID
FROM #EXAMPLE
WHERE PARENT_ORDER_ID = 0
UNION ALL
SELECT c.Id,e.ORDER_ID,e.PARENT_ORDER_ID
FROM CTE c
INNER JOIN #EXAMPLE e
ON c.ORDER_ID = e.PARENT_ORDER_ID AND c.Id = e.Id
)
SELECT ID,
(CASE WHEN PARENT_ORDER_ID = 0 THEN ORDER_ID ELSE PARENT_ORDER_ID END) ORDER_ID,
ORDER_ID CHILD_ORDER_ID
FROM CTE
ORDER BY ID