2011-11-10 36 views
2
TerritoryId, Description, ParentTerritoryId, Type 
-------------------------------------------------------- 
    1, UnitedStates, null, Territory 
    1, John Smith, 1, Sales Rep 
    2, Georgia, 1, Territory 
    2, Jane Doe, 2, Sales Rep 
    2, Ann Smith, 2, Sales Rep 

有人可以幫助我與t-sql。比方說,我在尋找像安·史密斯得到銷售代表和他們所屬的地方

一個名字,我想結果集的樣子:

1, United States, null, Territory 
2, Georgia, 1, Territory 
2, Ann Smith, 2, Sales Rep 

基本上,我想找到一個銷售代表或銷售代表和什麼組織他們屬於一直到連鎖店。

+0

是你的「的TerritoryID」字段應該是在第一臺獨特之處? – David

回答

0

雖然表中可能有多級結構,但理想情況下您希望拆分表。

一個表爲領土,一個爲銷售代表。

如果您的銷售代表可能有多個地區,您需要去3個表 一個用於銷售代表,一個用於地區,一個查詢表。

,如果你要做,你需要的每個條目有一個唯一的ID

+0

查找表是否與銷售代表和區域之間的關聯表格同義? – Rod

+0

此外,如果我目前的任務是將銷售代表和區域置於UI中的樹狀視圖中,那麼在這種特殊情況下將它們聯合起來會更好嗎?什麼是最佳做法? – Rod

+0

查找表是顯示salesrep ID和地區ID的關聯表。通常情況下,加入就是完成它的方式,但是我已經看到它在一張表中完成了所有工作,但是表現很差,這是一個噩夢來維護。 –

2

假設的SQL Server 2005+,所以我們可以用一個recursive CTE並假設中的TerritoryID值確實應該是唯一的一個多層次表:

TerritoryId Description ParentTerritoryId Type 
-------------------------------------------------------- 
1   UnitedStates NULL    Territory 
2   John Smith 1     Sales Rep 
3   Georgia  1     Territory 
4   Jane Doe  3     Sales Rep 
5   Ann Smith  3     Sales Rep 

然後,你可以這樣做:

WITH cteRecursion AS (
    SELECT TerritoryId, Description, ParentTerritoryId, Type, 1 AS Level 
     FROM YourTable 
     WHERE Description = 'Ann Smith' 
    UNION ALL 
    SELECT t.TerritoryId, t.Description, t.ParentTerritoryId, t.Type, c.Level + 1 
     FROM YourTable t 
      INNER JOIN cteRecursion c 
       ON t.TerritoryId = c.ParentTerritoryId 
) 
SELECT TerritoryId, Description, ParentTerritoryId, Type 
    FROM cteRecursion 
    ORDER BY Level DESC;