如何解决SQL 选择不同表上具有相同 FK 值的行
我需要创建一个查询,列出在一个国家/地区能说所有必需语言的每个人。我有 3 个表(国家/地区/语言/人) 问题是我在国家和人民表之间没有链接,但每个表都有一个外键“Language_Id”。我的目标是列出每个拥有与 Country 一样多语言的人。 这是一个例子:
表人:
ID Name Language_ID
1. 1 Paul 1
2. 2 Paul 2
3. 3 Max 1
4. 4 Ben 2
5. 5 Paul 3
6. 6 Ben 3
表格语言:
ID Name
1. 1 English
2. 2 Dutch
3. 3 french
表国家:
ID Name Language_ID
1. 1 France 3
2. 2 Netherlands 1
3. 3 Netherlands 2
4. 4 Belgium 2
5. 5 Belgium 3
结果表:
Name Country_Name
1. Paul France
2. Paul Netherlands
3. Paul Belgium
4. Ben Belgium
5. Ben France
因此,Max 被排除在结果之外,因为他没有所有必需的语言。
我正在运行 sql Server 2016 标准版。
你能帮我找到解决方案吗?
谢谢!
解决方法
您可以使用 join
和聚合。一个棘手的部分是计算一个国家/地区内的语言数量,以确保一个人会说所有语言:
select p.name,c.name,c.num_languages
from people p join
(select c.*,count(*) over (partition by name) as num_languages
from country c
) c
on p.language_id = c.language_id
group by p.name,c.num_languages
having count(*) = c.num_languages;
,
一种方法可以使用 CTE 来计算每个国家/地区的语言,然后每个人使用的语言,并过滤每个人使用的语言至少是每个国家/地区所需的语言:
with c as (
select name Country_Name,language_id,Count(*) over(partition by name) LanguageCount
from country
),p as (
select p.name,c.Country_Name,c.LanguageCount,Count(*) over(partition by p.name,c.Country_Name)Languages
from c join people p on p.Language_ID=c.language_id
)
select distinct p.name,p.Country_Name
from p
where Languages>=LanguageCount;
,
如果您构建每个人所说的每种语言的组合,并将其与每个国家/地区的要求相匹配,您就可以获得所需的内容。
With build as (
Select Name,cast(language_id as varchar) as languages,language_id as last_lang
From People
Union All
Select a.Name,a.languages + ';' + cast(language_id as varchar) as languages,b.language_id as last_lang
From build a Inner Join People b On a.Name=b.Name
Where a.last_lang<b.language_id
)
Select P.Name,C.Name
From (
Select Name,String_Agg(cast(language_id as varchar),';') Within Group (Order By language_id) as Language_Reqs
From Country
Group By Name
) C Inner Join build P on P.Languages=C.Language_Reqs
还可以修改此技术以识别个人可能缺乏需求的地方。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。