2011-07-09 77 views
3

項目的數量,我有以下表格:TSQL - 查詢來獲取與每個類別和子類別

Categories 
================================= 
CategoryID | ParentID | Text 
--------------------------------- 
    1   NULL  Text 
    2   1   Text 
    3   NULL  Text 
    4   1   Text 

Items 
================================= 
    ItemID | CategoryID | Text 
--------------------------------- 
    1   1   Text 
    2   2   Text 
    3   4   Text 
    4   3   Text 

請記住,這不是一個n級層次,類別只有2級,所以例如,沒有類別可以具有2的parentID。

我在尋找的是一種返回類別的方法,使用一個額外的列來顯示類別擁有的項目數量(包括其子類別)。

即我正在尋找一個單一查詢(或程序),它可以返回類似如下:

 Categories 
============================================ 
CategoryID | ParentID | Text | Count 
-------------------------------------------- 
    1   NULL  Text  3 
    2   1   Text  1 
    3   NULL  Text  1 
    4   1   Text  1 

我目前得到關聯到一個類別項目的方法如下(給定的categoryID ,@CategoryID):

SELECT * FROM Items 
WHERE CategoryID 
IN (SELECT CategoryID FROM Categories where ParentID = @CategoryID or CategoryID = @CategoryID) 

我的問題是,我似乎無法將其鏈接到類別本身的選擇查詢。 這可能非常簡單,但我已經嘗試過使用CTE的各種分組,但是分類的層次性似乎讓我的邏輯關閉。

感謝您的幫助!

編輯:查詢還需要考慮到沒有關聯到他們的項目類別

回答

3

你必須通過你從類別表所需的任何字段加入項目類別和組:

SELECT c.CategoryID 
,  c.ParentID 
,  c.Text 
,  count(distinct i.ItemID) 
FROM Categories c 
LEFT JOIN 
     Categories c2 
ON  c.CategoryID = c2.ParentID 
LEFT JOIN  
     Items i 
ON  i.CategoryID = c.CategoryID 
     or i.CategoryID = c2.CategoryID 
GROUP BY 
     c.CategoryID 
,  c.ParentID 
,  c.Text 
+0

感謝您的迴應! - 首先,我如何解釋變量的使用? (我會使用c.CategoryID) - 那麼這個查詢似乎只產生一個計數只有一個類別節點(它不考慮兒童),即在這個例子中,計數產生類別1將是1. 此外,沒有任何項目與他們聯繫似乎沒有考慮類別連接?我會更新我的問題:) – Jaime

+0

@Jaime:澄清你的問題:)我已經刪除了變量。您可以在沒有任何項目的情況下加入「左連接」。 – Andomar

+0

謝謝! :)雖然現在看起來有一種奇怪的效果 - 它將所有類別的計數任意分配爲1,因此例如,具有1個分項的分類(無子分類)的計數爲1,但具有0項還有1的計數?也許在類似的筆記 - 類別1的計數似乎顯示爲4而不是3,我會嘗試並找出它,但它不會顯示爲其他人的答案,所以這個評論應該澄清的東西:) – Jaime