簡體   English   中英

將ORACLE層次結構START WITH / CONNECT BY PRIOR轉換為SQL Server CTE

[英]Converting ORACLE hierarchical START WITH / CONNECT BY PRIOR to SQL Server CTE

我無法將當前的ORACLE腳本轉換為等效的MS SQL Server版本,以實現相同的功能。

我所做的所有研究都指出,CTE是唯一的解決方案,而我所做的大部分都是有效的。 唯一剩下的問題是順序不正確-因此,我的意思是“層次結構”沒有正確顯示。 我嘗試使用ORDER BY將結果集放入行中,然后嘗試ROW_NUMBER()等,但是這些方法都無法正常工作。 我認為主要的問題是該腳本沒有像Oracle腳本那樣在上下層次上進行解析-然后我試圖“更正”在CTE完成之后,這使我陷入了更深的洞里。

這是下面的兩個腳本;

當前的Oracle SQL腳本版本(完美運行)

SELECT lpad('-',2*(level-2), '-') || l.lcname descr, r.lrlocuri1 id, l.lciswithin, l.lctype, 1 lcisactive, l.lcvalidto 
    FROM tslocrel r,  tslocation l WHERE l.uri=r.lrlocuri1
    AND level>1 AND level<6
    AND lctype=1 AND lcvalidto<'2' 
START WITH lrlocuri1=4485 CONNECT BY PRIOR lrlocuri1 = lrlocuri2 

我的MS SQL Server版本WIP嘗試(SQL 2012是目標版本)

WITH locationCTE (lcname, lrlocuri1, lciswithin, lctype, lcisactive, lcvalidto, level) AS (

  SELECT l.lcname, r.lrlocuri1, l.lciswithin, l.lctype, 1 AS lcisactive, l.lcvalidto, 1 AS level
  FROM tslocrel r
  INNER JOIN tslocation l ON r.lrlocuri1 = l.uri
  AND r.lrlocuri1=4485

  UNION ALL

  SELECT l.lcname, r.lrlocuri1, l.lciswithin, l.lctype, 1 AS lcisactive, l.lcvalidto, cte.level + 1 AS level
  FROM tslocrel r
  INNER JOIN tslocation l ON r.lrlocuri1 = l.uri
  INNER JOIN locationCTE cte ON cte.lrlocuri1 = r.lrlocuri2

)

SELECT RIGHT(REPLICATE('-', 2*(level-2)) + LEFT('-', 2*(level-2)), 2*(level-2)) + lcname AS descr, lrlocuri1 id, lciswithin, lctype, lcisactive, 
lcvalidto
FROM locationCTE
WHERE level>1 AND level<6
AND lctype=1 AND lcvalidto<'2'

我嘗試了一些其他嘗試,並且基本上保持相同的結果。 這些查詢在TRIM數據庫上運行,並且應該通過在lrlocuri1和lrlocuri2中進行導航來列出“位置”的層次結構,例如,如下所示;

General Manager
  -Corporate Support
    --Customer Service
      --Xxxxxxx
      --Xxxxxxx
      (etc)
    --Finance
      --Xxxxx
  -Environment and Planning
    --Xxxxx
    --Xxxxx
  -Xxxxxxxxxxxx
    --Xxxxx
    --XXxxx

等等

根據定義,Oracle按深度優先順序返回層次結構數據集。 因此,您在這里的訂購是正確的(例如https://docs.oracle.com/cd/B19306_01/server.102/b14200/queries003.htm )。

另一方面,SqlServer沒有此結果集排序。 您必須自己訂購數據行。 我的解決方案是為每行構建一個分層的路徑值,以在選擇數據后進行排序。 如果每一行都有一個id值,則類似這樣

parent-id / child-id

這是一個很好的例子: 在遞歸CTE下控制同級順序嗎? (查看列路徑 )。

如果還有其他針對SQLServer的解決方案(主要是針對SQLServer的最新版本),我將非常感興趣。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM