我有一個自連接表,它記錄了進程中每個「步驟」的一條記錄(Step.ParentStepId是Step.StepId的外鍵):自加入查詢以查找節點語法問題的後代
CREATE TABLE [dbo].[Step](
[StepId] [int] IDENTITY(1,1) NOT NULL,
[Name] [varchar](50) NOT NULL,
[Description] [text] NULL,
[Sequence] [int] NULL,
[ParentStepId] [int] NULL,
CONSTRAINT [PK_Step] PRIMARY KEY CLUSTERED
(
[StepId] ASC
)
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
ALTER TABLE [dbo].[Step] WITH CHECK ADD CONSTRAINT [FK_Step_Step] FOREIGN KEY([ParentStepId])
REFERENCES [dbo].[Step] ([StepId])
我想編寫一個查詢來返回給定StepId是父級(在任何級別)的所有步驟。
Oracle以前對此有一些很酷的SQL擴展。這將如何在T-SQL,SQL 2008,R2中完成?
這是我的嘗試。請幫助我,遞歸往往會傷害我的頭。
DECLARE @StepId INT = 3
WITH cteRecursion
AS (SELECT
Stepid
,1 AS Level
FROM
Step
WHERE
StepId = @StepId
UNION ALL
SELECT
t.StepId
,c.Level + 1
FROM
Step t
INNER JOIN cteRecursion c
ON t.ParentStepId = c.StepId
)
SELECT
StepId,Level
FROM
cteRecursion
ORDER BY
Level,
StepId;
運行時:
消息319,15級,狀態1,第3行
'與' 關鍵字附近有語法錯誤。如果此語句是 公用表表達式,xmlnamespaces子句或跟蹤 上下文子句的更改,則必須以 分號終止上一個語句。
啊。我想我對SQL很害怕,很快就被打包了。我從來沒有超過「關鍵字附近的語法錯誤」,並且使用「。」。奇怪語法!謝謝。在T-SQL中有沒有一種方法可以像oracle中那樣以縮進文本「樹」格式顯示ourput?這聽起來像另一個SO問題,答案可能是「不」。 – ChadD
@chad:不,SQL Server會*給你提供數據 - 準備/呈現它,是另一項工作(而不是SQL Server的) –
我同意。我很驚訝oracle有這樣一個格式化樹輸出的函數。然而......這對於快速調試結果來說非常方便! – ChadD