2011-12-22 200 views
2

我在最後的select語句有問題。我想要做的是選擇兩個級別,但即時通過此聲明沒有結果。請注意,如果@Level爲1,我不想低於1,否則可能會混淆結果,因此可能會出現一個條件以及select語句where子句二的條件

它所在的部分@Level = @Level -1我是具有

FROM c WHERE c.Level = @Level AND c.Level = @Level - 1 ORDER BY Level ASC 

或這一個

FROM c WHERE c.Level BETWEEN @Level AND c.Level - 1 ORDER BY Level ASC 

SQL問題

DECLARE @Department TABLE 
(
Id INT NOT NULL, 
Name varchar(50) NOT NULL, 
ParentId int NULL 
) 

INSERT INTO @Department SELECT 1, 'Toys', null 
INSERT INTO @Department SELECT 2, 'Computers', null, 
INSERT INTO @Department SELECT 3, 'Consoles', 2 
INSERT INTO @Department SELECT 4, 'PlayStation 3', 3 
INSERT INTO @Department SELECT 5, 'Xbox 360', 2 
INSERT INTO @Department SELECT 6, 'Games', 1 
INSERT INTO @Department SELECT 7, 'Puzzles', 6 
INSERT INTO @Department SELECT 8, 'Mens Wear', null 
INSERT INTO @Department SELECT 9, 'Mens Clothing', 8 
INSERT INTO @Department SELECT 10, 'Jackets', 9 
INSERT INTO @Department SELECT 11, 'Shoes', 9 
INSERT INTO @Department SELECT 12, 'Rain Coats', 10 

DECLARE @Level int = 4 
;WITH c AS 
(
SELECT Id, ParentId, Name, 1 AS Level 
FROM @Department 
WHERE ParentId IS NULL 

UNION ALL 

SELECT t.Id, t.ParentId, T.Name, c.Level + 1 AS Level 
FROM @Department T 
INNER JOIN c on t.ParentId = c.Id 
) 
SELECT Id, ParentId, Name, Level 

FROM c WHERE c.Level = @Level AND c.Level = @Level - 1 ORDER BY Level ASC 

FROM c WHERE c.Level BETWEEN @Level AND @Level - 1 ORDER BY Level ASC 
+0

顯示你想要的結果。 – JeffO 2011-12-22 23:26:11

+0

如果你只進入一個級別,你可以加入這個表格,並將你的條件放在on子句中。 – JeffO 2011-12-22 23:26:55

回答

2

也許FROM c WHERE c.Level BETWEEN @Level -1 AND @Level ORDER BY Level ASC

1

這裏這段代碼是NEVER能工作:

@Level = @Level - 1 

我想你的意思是說:

c.Level = @Level - 1 

即使在那個......你可能要一個OR而不是一個AND

想想你在問什麼......「給我所有的記錄,同時水平是4和5。」

你說的意思可能是......「給我所有關於4或5的記錄。」

+0

不行,我試了一下 – ONYX 2011-12-22 22:12:00

0

看一看下面的SQL,它具有4行3級和1回來爲4級:

SELECT p.Id as ParentId, 
    p.Name as Parent, 
    c.Id, 
    c.Name, 
    c.Level 
FROM c as c 
left join c p 
on p.Id = c.ParentId 
WHERE c.Level = @Level 
ORDER BY p.Name, c.Name ASC 
0

好了,你的遞歸CTE似乎是正確的。我通常不會把name放在CTE中(主要是因爲這個表只是父/子字段,或者有太多),然後加入,但它仍然可以正常工作。

正如已經指出的那樣,你真正的問題是,你的where子句是無意義的:

  • WHERE c.Level = @Level AND c.Level = @Level - 1基本上詢問是否c.level == c.Level - 1 - 這是總是假。
  • WHERE c.Level BETWEEN @Level AND @Level - 1要求@Level >= c.Level >= @Level - 1@Level >= @Level - 1 - 另一個不可能的條件。

這兩種方法中的一種應該工作得很好,如果略作修改:

  • WHERE c.Level = @Level OR c.Level = @Level - 1
  • WHERE c.Level BETWEEN @Level - 1 AND @Level

(如果@Level輸入爲1沒關係 - 因爲你一開始,沒有更低的報告級別)。