你需要做的這一個時間表設置(如果您不想使用數字表,請參閱下面的替代解決方案):
SELECT TOP 10000 IDENTITY(int,1,1) AS Number
INTO Numbers
FROM sys.columns s1
CROSS JOIN sys.columns s2
ALTER TABLE Numbers ADD CONSTRAINT PK_Numbers PRIMARY KEY CLUSTERED (Number)
一旦Numbers表格設置,使用此查詢:
DECLARE @ParentTable table (ID int,Name varchar(20))
DECLARE @ChildTable table (ID int,ParentID int,Name varchar(20))
INSERT INTO @ParentTable VALUES (1,'Bob')
INSERT INTO @ChildTable VALUES (1,1,'Jim')
INSERT INTO @ChildTable VALUES (2,1,'Ned')
SELECT DISTINCT
dt.Name,c.Name
FROM (SELECT
CASE WHEN n.Number=1 THEN NULL ELSE p.ID END AS ID,p.Name
FROM @ParentTable p
INNER JOIN Numbers n ON 1=1
WHERE p.ID=1 AND n.Number<=2
) dt
LEFT OUTER JOIN @ChildTable c ON dt.ID=c.ParentID
ORDER BY 1,2
OUTPUT:
Name Name
-------------------- --------------------
Bob NULL
Bob Jim
Bob Ned
(3 row(s) affected)
替代解決方案,如果你不希望創建一個數字表,你可以使用此方法返回與上面相同的輸出:
SELECT DISTINCT
dt.Name,c.Name
FROM (SELECT
CASE WHEN n.Number=1 THEN NULL ELSE p.ID END AS ID,p.Name
FROM @ParentTable p
INNER JOIN (SELECT ROW_NUMBER() OVER(ORDER BY object_id) AS Number FROM sys.columns) n ON n.Number<=2
WHERE p.ID=1 AND n.Number<=2
) dt
LEFT OUTER JOIN @ChildTable c ON dt.ID=c.ParentID
ORDER BY 1,2
我正在嘗試使用CTE來擴展父行,但是如果不使用UNION就很難!
爲什麼你不希望使用某個工會嗎? – 2009-09-29 19:10:51
你爲什麼要這樣做?無論你想要做什麼,肯定有更好的方法。 – erikkallen 2009-09-29 19:13:29
如果深度是靜態的,則可以使用具有相同表格的連接。 – 2009-09-29 19:23:30