我正在努力归还给定老师教授的所有中/高中课程 . 通过两个表的内部联接,可以正确显示3行 . 当我使用第3个表进行第二次内连接时,它返回6行而不是3行 .
不使用cte,DISTINCT,如何显示带有empid,中间类和高中类的3行?此外,两个外表都应该与主表连接 .
IF OBJECT_ID('tempdb..#empl') IS NOT NULL DROP TABLE #empl
IF OBJECT_ID('tempdb..#middlecourses') IS NOT NULL DROP TABLE #middlecourses
IF OBJECT_ID('tempdb..#highcourses') IS NOT NULL DROP TABLE #highcourses
create table #empl
(
EmpId int,
Grade int
)
insert into #empl select 1, 5
create table #middlecourses
(
EmpId int,
Grade int,
Course varchar(20)
)
insert into #middlecourses select 1, 5, 'Science'
insert into #middlecourses select 1, 5, 'Math'
insert into #middlecourses select 1, 5, 'English'
create table #highcourses
(
EmpId int,
Grade int,
Course varchar(20)
)
insert into #highcourses select 1, 5, 'Calculus'
insert into #highcourses select 1, 5, 'Physics'
insert into #highcourses select 1, 5, 'CompSci'
select e.empid, e.grade, m.course as 'MiddleCourse'
from #empl e inner join #middlecourses m
on e.empid = m.empid
and e.grade = m.grade
select e.empid, e.grade, m.course as 'MiddleCourse', h.course as 'HighCourse'
from #empl e inner join #middlecourses m
on e.empid = m.empid
and e.grade = m.grade
inner join #highcourses h
on e.empid = h.empid
and e.grade = h.grade
drop table #empl
drop table #middlecourses
drop table #highcourses
5 回答
可能有一个更优雅的解决方案,但这应该适用于给出的场景:
这是因为你的所有
empid
和_1231399都是一样的 . 此连接多次匹配 .您已经在第一次加入时看到了这一点,
#Empl
中的行被重复三次(因为它匹配#MiddleCourses
中的所有3条记录) .要减少这些,您需要使用更多的连接和/或使用不同的数据 . 尝试更改
empid
和grade
,您希望看到我的意思 .是的,edmondson是对的 . 您可以做的是一个带有ROW_NUMBER()的简单数据透视图,以使行唯一 .
您可以使用
ROW_NUMBER()
将middlecourses
与highcourses
匹配,具体取决于字母course
排序:Output:
以上内容仅适用于
middlecourses
和highcourses
的数量相等的情况 .如果
middlecourses
和highcourses
的数量不匹配,您可以使用上述查询的更复杂的变体:在
highcourses
中还有一条记录:output is:
当您执行以下查询时,会出现您的问题
你会得到这个记录 .
所以你得到了3条预期的记录,因为在#middlecourse表中有3条记录,其中empid = 1.所以内部联接就是这样的 . 它将从#empl表中一次选择一个empid并尝试在第二个表中找到此empiid的匹配行,即#middlecourses
所以你有3条以上的查询记录 . 现在当你添加第二个内连接时,它会尝试从3个以上的记录中获取empid,并与第三个表#highcoures匹配 . 因此,对于每个empiid它将返回3记录 . 所以你将从第二个查询中获得 3*3 = 9 记录 .
这种情况的一个解决方案是在您的课程表上进行联合,然后使用#empl表进行内部联接 .