TSQL查询返回两次具有相同表的内部联接的行两次

fdk*_*fsf 9 sql t-sql sql-server

我正在努力归还给定老师教授的所有中/高中课程.通过两个表的内部联接,可以正确显示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
Run Code Online (Sandbox Code Playgroud)

m.e*_*son 0

这是因为你的empidgrade都是一样的。这个连接匹配了很多次。

您已经在第一次连接中看到了这一点, 中的行#Empl被重复了 3 次(因为它与 中的所有 3 条记录匹配#MiddleCourses)。

为了减少这些,您需要使用更排他性的联接和/或使用不同的数据。尝试改变empidand grade,你就会明白我的意思。