Sql 内部连接和部分匹配

Sql 内部连接和部分匹配,sql,tsql,Sql,Tsql,我不确定标题是否正确,所以就这样吧 下面的脚本返回正确的结果:目前罗伊·布朗教授数学101。罗伊·布朗的教师ID是1225,但后来他们添加了前缀001——用于其他目的 我想在结果中包括的是,罗伊·布朗在某个时间点上确实有另一门课程,因为数学101 Old有1225门。它甚至不需要显示他有多少其他课程;这会让我知道#coursessv中不止一行。但是结果应该保留为2行 我不想为Roy Brown显示一个额外的行,这就是为什么我不做注释的内部连接(即right(t.teacherid,4)=righ

我不确定标题是否正确,所以就这样吧

下面的脚本返回正确的结果:目前罗伊·布朗教授数学101。罗伊·布朗的教师ID是1225,但后来他们添加了前缀001——用于其他目的

我想在结果中包括的是,罗伊·布朗在某个时间点上确实有另一门课程,因为数学101 Old有1225门。它甚至不需要显示他有多少其他课程;这会让我知道
#coursessv
中不止一行。但是结果应该保留为2行

我不想为Roy Brown显示一个额外的行,这就是为什么我不做注释的
内部连接
(即
right(t.teacherid,4)=right(c.teacherid,4)

这两个表之间没有关系,因为
#coursessv
中的数据来自csv文件

IF OBJECT_ID('tempdb..#teacher') IS NOT NULL DROP TABLE #teacher
IF OBJECT_ID('tempdb..#coursesCsv') IS NOT NULL DROP TABLE #coursesCsv

create table #teacher
(
    TeacherID varchar(10),
    FullName varchar(30)
)

insert into #teacher select '001-1225', 'Roy Brown'
insert into #teacher select '001-1230', 'Woody Boyd'


create table #coursesCsv
(
    CourseName varchar(30),
    TeacherID varchar(10)
)
insert into #coursesCsv select 'Math 101', '001-1225'
insert into #coursesCsv select 'Math 101 Old', '002-1225'
insert into #coursesCsv select 'History 101', '001-1230'

select t.teacherid, c.coursename from 
#teacher t inner join #coursesCsv c
on t.teacherid = c.teacherid
--on right(t.teacherid,4) = right(c.teacherid,4)
在派生表(或公共表表达式=WITH)中,对同一
权限(teacherid,4)
的课程进行“分组计数”,并将其加入:

select t.teacherid, c.coursename, c.coursecnt
from teacher t 
inner join 
 (
   select 
      teacherid,
      coursename,
      count(*)
      over (partition by right(teacherid,4)) as coursecnt
   from coursesCsv
 ) as c
on t.teacherid = c.teacherid