2011-02-01 231 views
1

請複製並運行以下腳本。從自我加入表中獲取父母的父母

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的情況下,沒有縣 - 只是一個國家/大洲?

你怎麼知道從輸出結果中「跳過」Somerset,North 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

Thanks @Marc_s。使用你的代碼。我設法得到所需的輸出使用臨時表和更新該臨時表。 – Kashif 2011-02-01 12:13:12