如何以特定方式显示(递归)数据集?

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

sqlfiddle