2011-11-10 7 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

テーブルにマルチレベル構造を持たせることは可能ですが、テーブルを分割するのが理想的です。

領地用テーブルと営業担当者用テーブル。

営業担当者が複数の地域を持つことができる場合は、営業担当者用にテーブル 、テリトリー用に1つ、ルックアップテーブルに3つのテーブルに行く必要があります。

あなたは

+0

ルックアップテーブルは、営業担当者と地域の間の関連テーブルと同義ですか? – Rod

+0

また、私の現在の仕事が営業担当者や地域をUIでツリービューにすることは、この特定のケースでそれらを結合する方が良いでしょうか?ベストプラクティスとは何ですか? – Rod

+0

ルックアップテーブルは、salesrep IDとTerritory IDを示す関連テーブルです。通常はそれが行われる方法ですが、1つのテーブルですべてが完了したことを確認しましたが、パフォーマンスは悪く、維持するのは悪夢でした。 –

2

は、私たちはrecursive CTEを使用することができますSQL Serverの2005+を仮定し、TerritoryId値が本当にユニークである必要があると仮定すると一意のIDを持つように各エントリを必要とするマルチレベルのテーブルをやろうとしている場合:

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; 
関連する問題