在多个表中递归的SQL Server查询

nsi*_*akr 0 sql database sql-server-2008

我的表格结构如下,样本数据如下:名称:用户

User   Region
Sam    USA    
Meyer  NA    
Ying   Japan    
Yang   Asia
Run Code Online (Sandbox Code Playgroud)

我还有另一张表,包括该地区和国家

名称:地区

       Region Country         RegionList    
        USA     America            
        NA       NULL          USA            
        NA      Canada            
        NA      Mexico            
        Japan   Japan
        Asia     NULL         Central        
        Asia      NULL         East        
        Central  India        
        East     Dubai
        Central  Japan
Run Code Online (Sandbox Code Playgroud)

如何编写SQL服务器查询以列出他/她代表的每个用户和相应的国家/地区?

喜欢:

Sam   America
Meyer America
Meyer Canda
Meyer Mexico
Ying  Japan
Yang  Japan
Yang  India
Yang  Dubai
Run Code Online (Sandbox Code Playgroud)

flu*_*lup 5

如果Region表可能具有无限多个级别,则可以使用公用表表达式.请参阅使用公用表表达式的递归查询.

WITH UserRegions (username, region, country)
AS
(
    -- Anchor member definition
    SELECT u.[user] AS username, r.regionlist AS region, r.country
    FROM [User] u
    JOIN Region r
        ON u.Region = r.Region
    UNION ALL
    -- Recursive member definition
    SELECT ur.username, r.regionlist AS region, r.country
    FROM Region r
    INNER JOIN UserRegions AS ur
        ON r.Region = ur.Region
)
-- Statement that executes the CTE
SELECT username, country
FROM UserRegions
WHERE country IS NOT NULL
ORDER BY username
Run Code Online (Sandbox Code Playgroud)

http://sqlfiddle.com/#!3/ca9de/8