2011-02-01 18 views
1

以下のスクリプトをコピーして実行してください。自己結合表からParentの親の親を取得

DECLARE @Locations TABLE 
(
    LocationId INT, 
    LocationName VARCHAR(50), 
    ParentId INT 
) 

INSERT INTO @Locations SELECT 1, 'Europe', NULL 
INSERT INTO @Locations SELECT 2, 'UK', 1 
INSERT INTO @Locations SELECT 3, 'England', 2 
INSERT INTO @Locations SELECT 4, 'Scotland', 2 
INSERT INTO @Locations SELECT 5, 'Wales', 2 
INSERT INTO @Locations SELECT 6, 'Cambridgeshire', 3 
INSERT INTO @Locations SELECT 7, 'Cambridge', 6 
INSERT INTO @Locations SELECT 8, 'North Scotland', 4 
INSERT INTO @Locations SELECT 9, 'Inverness', 8 
INSERT INTO @Locations SELECT 10, 'Somerset', 3 
INSERT INTO @Locations SELECT 11, 'Bath', 10 
INSERT INTO @Locations SELECT 12, 'Poland', 1 
INSERT INTO @Locations SELECT 13, 'Warsaw', 12 

私は感謝

enter image description here

結果、次のようなものを必要としています。

答えて

4

現在のデータセットではこれを行うことはできません。 LocationId=11の場合は郡/国/大陸があり、LocationId=13の場合は郡がありません - 国/大陸ですか?

あなたの出力結果からSomersetNorth Scotlandなどのエントリを「スキップする」ことをどのように知っていますか?

あなたは間違いなく、ここでより多くの情報が必要....この再帰CTE(共通テーブル式)クエリで

、あなたが場所与えられた任意ののために、先頭に階層までの「はしご」を得ることができます:

DECLARE @LocID INT = 13 

;WITH LocationHierarchy AS 
(
    SELECT LocationId, LocationName, ParentId, 1 AS 'Level' 
    FROM @Locations 
    WHERE LocationId = @LocID 

    UNION ALL 

    SELECT l.LocationId, l.LocationName, l.ParentId, lh.Level + 1 AS 'Level' 
    FROM @Locations l 
    INNER JOIN LocationHierarchy lh ON lh.ParentId = l.LocationId 
) 
SELECT 
    LocationName, 
    LocationId, 
    Level 
FROM LocationHierarchy 

このCTEは、SQL Server 2005上で動作し、アップ - SQL Server 2000の上で、あなたは運の外出、残念ながら(アップグレードする時間!!)。

これにより、単一のエントリの階層を上に戻すことができますが、探しているデータセットを返すことはできません。現在のデータからこれを判断するのに十分な情報がありません。

@LocID=13については

(ワルシャワ)、あなたはこの出力を得る:

LocationName LocationId Level 
    Warsaw    13    1 
    Poland    12    2 
    Europe    1    3 

@LocID=7(ケンブリッジ)のために、あなたが得る:

LocationName LocationId Level 
    Cambridge    7    1 
    Cambridgeshire  6    2 
    England    3    3 
    UK     2    4 
    Europe    1    5 

をそこから、あなたはいくつかを使用する必要があると思いますあなたの探している正確な出力を得るためにあなたのアプリにスマート。

+0

ありがとう@Marc_s。あなたのコードを使用する。私は、一時テーブルを使用して必要な出力を取得し、その一時テーブルを更新することができました。 – Kashif

関連する問題