带有查找表和链接表的一对多查询
Posted
技术标签:
【中文标题】带有查找表和链接表的一对多查询【英文标题】:One-to-many query with lookup and link tables 【发布时间】:2020-11-21 08:20:48 【问题描述】:我当前的测试围绕着一个假设的数据库,该数据库由一个 Person
表组成,该表主要由查找表中的 Id 填充。
我还有一个Training
表,它还有一个Id
链接到Course
表。
我创建了一个名为PersonTraining
的链接表,通过它们各自的ID 链接Person
和Training
表。 See Image
我的目标是返回结果表的查询。
我可以创建一个返回 Person
表的查询,并将所有 id 替换为它们各自的查找表值。本质上这是下面的,相信这是正确的方法吗?
Select
PersonId, Name, [DepartmentTable].Department, [PayTable].Pay
From
[PersonTable]
Left Join
[DepartmentTable] on [PersonTable].DepartmentId = [DepartmentTable]. DepartmentIdLeft
Join
[PayTable] on [PersonTable]. PayId = [PayTable]. PayId
但是,我无法弄清楚如何将其连同他们参加的课程名称一起返回。
任何帮助将不胜感激
【问题讨论】:
【参考方案1】:不完全清楚“培训”和“课程”之间的区别是什么......这两个单独的表吗? 1:1的关系?
但假设您想扩展现有查询以包含从 Person
到 Training
的 m:n 链接 - 试试这个:
Select
p.PersonId, p.Name, d.Department, pay.Pay,
c.CourseName
From
dbo.[PersonTable] p
Left Outer Join
dbo.[DepartmentTable] d on p.DepartmentId = d.DepartmentId
Inner Join
dbo.[PayTable] pay on p.PayId = pay.PayId
-- do a left join to the association table - not every person will have a training
Left Outer Join
dbo.PersonTrainingTable pt on p.PersonId = pt.PersonId
-- do a left join to the training table
Left Outer Join
dbo.TrainingTable t on pt.TrainingId = t.TrainingId
Left Outer Join
dbo.CourseTable c on t.CourseId = c.CourseId
更新: 添加了 CourseTable
并确保使用您拥有的名称(但为什么您要调用每个表 AbcTable
- 很明显这是一个表,该后缀根本没有增加任何附加值..)
【讨论】:
感谢您的回复,并质疑“培训”和“课程”表之间的区别,因为它让我意识到我现在已经在图像中纠正了一个错误。我尝试了您建议的解决方案,但很遗憾它没有奏效,但这可能是由于我最初的错误。 非常感谢这项工作与一个小的修改第 7 行“d.DepartmentIdLeft”我认为应该阅读“d.DepartmentId”以上是关于带有查找表和链接表的一对多查询的主要内容,如果未能解决你的问题,请参考以下文章
SpringBoot与Mybatis整合(包含generate自动生成代码工具,数据库表一对一,一对多,关联关系中间表的查询)