2013-03-08 91 views
0

我有一个表结构与样本数据如下递归如下 名称:用户SQL Server查询是在多个表

User Region 
Sam USA  
Meyer NA  
Ying Japan  
Yang Asia 

我也有另一个表,与地区和国家

名称:地区

 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 

怎么写SQL服务器查询到列表中的用户和相应的国家,他/她代表?

像:

Sam America 
Meyer America 
Meyer Canda 
Meyer Mexico 
Ying Japan 
Yang Japan 
Yang India 
Yang Dubai 
+1

你是谁和你做了我的数据库架构? – 2013-03-08 20:58:53

回答

5

如果您的Region表可能有无限多级的深度,那么可以使用Common Table Expression。见Recursive Queries Using Common Table Expressions.

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 

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

+0

对于给定的用户名,查找国家列表是我已经做的事情。希望为每个用户找到他/她所代表的国家的名单。 – user373215 2013-03-08 21:12:45

+0

这个问题似乎表明他关心递归,但他的样本结果似乎表明他没有。 – 2013-03-08 21:13:08

+0

谢谢flup。欣赏它。 – user373215 2013-03-08 21:29:47

0

您可以使用,如果你想返回所有用户,即使他们没有任何国家,那么你可以使用JOIN来获得您想要的结果

SELECT user, isNull(Country,RegionList) Country 
FROM user 
    JOIN region ON users.region = region.region 
ORDER BY user, Country 

LEFT OUTER JOIN

SELECT user, isNull(isNull(Country,RegionList),'No countries') Country 
FROM user 
    LEFT OUTER JOIN region ON users.region = region.region 
ORDER BY user, Country 
+0

这不符合他的模式的需要,因为它在Region表中有一些递归。 – 2013-03-08 21:07:30

+0

@KyleHale提供的结果不建议递归是相关的。 – 2013-03-08 21:09:55

+0

哈哈,你们俩都有一场倒退战?无论如何,马特的答案解决了这个问题。没有递归是必要的。 +1。 – 2013-03-08 21:28:23

-1

基于您提供的显式模式和样本数据:

select 
user, isnull(region.country, r2.country) as Country 
from 
user 
left join 
region 
on user.region = region.region 
left join 
region r2 
on r2.region = region.regionlist