带有查找表和链接表的一对多查询

Posted

技术标签:

【中文标题】带有查找表和链接表的一对多查询【英文标题】:One-to-many query with lookup and link tables 【发布时间】:2020-11-21 08:20:48 【问题描述】:

我当前的测试围绕着一个假设的数据库,该数据库由一个 Person 表组成,该表主要由查找表中的 Id 填充。

我还有一个Training 表,它还有一个Id 链接到Course 表。 我创建了一个名为PersonTraining 的链接表,通过它们各自的ID 链接PersonTraining 表。 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的关系?

但假设您想扩展现有查询以包含从 PersonTraining 的 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”

以上是关于带有查找表和链接表的一对多查询的主要内容,如果未能解决你的问题,请参考以下文章

Mybatis多表链接查询重复字段问题

sql 一对多的查询

SQL 一对多联表查询最大值

MyBatis一对多和一对一xml文件的配置

SpringBoot与Mybatis整合(包含generate自动生成代码工具,数据库表一对一,一对多,关联关系中间表的查询)

mysql表的一对一/一对多/多对多联系