与第二个表中的所有行完全外连接

问题描述 投票:0回答:1

我有下表。

在这里,对于候选人,我有高等教育、研究生或两种教育类型的行。 我正在寻找一个结果,该结果将有额外的行,其中候选人缺少高等教育或研究生教育。

我可以通过检查哪些候选人缺少资格和一个虚拟行来解决这个问题。然而,我正在尝试看看我是否可以使用虚拟资格表并进行某种完整的外部连接或外部应用以获得预期的结果。

帮助代码:

drop table if exists #candidate

create table #candidate
(
row_id int
,candidate_ref varchar(10)  
,qualification_type varchar(30)
,university_name varchar(30)
)

drop table if exists #dummytable

create table #dummytable
(
row_id int
,qualification_type varchar(30)
)

insert into #candidate
select 1, 'a',  'Higher Eduation'   ,'University X'      union
select 1, 'a',  'Higher Eduation'   ,'University Y'      union
select 1, 'a',  'Postgrad Education'    ,'University Y'  union
select 1, 'b',  'Higher Eduation'   ,'University U'      union
select 1, 'c',  'Higher Eduation'   ,'University 1'      union
select 1, 'c',  'Postgrad Education'    ,'University 1'  union
select 1, 'd',  'Postgrad Education'    ,'University C'  

insert into #dummytable
select 1, 'Higher Eduation' union
select 1, 'Postgrad Education'

我愿意拥有额外的虚拟键列(例如两个表的 row_id = 1)以启用完全外部连接。

sql sql-server tsql left-join sql-server-2016
1个回答
0
投票

您的表格没有真正正确规范化。

#candidate
表实际上是一个
#candidate_qualifications
,您应该有一个单独的
#candidate
表,其中包含所有独特的候选人。

现在你只需交叉连接两个父表,然后左连接链接表

SELECT
  c.candidate_ref,
  q.qualification_type,
  cq.university_name
FROM #candidate c
CROSS JOIN #qualifications q
LEFT JOIN #candidate_qualifications cq
  ON cq.candidate_ref = c.candidate_ref
 AND cq.qualification_type = q.qualification_type;

db<>小提琴

© www.soinside.com 2019 - 2024. All rights reserved.