【问题标题】: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

但是,我无法弄清楚如何将其连同他们参加的课程名称一起返回。

任何帮助将不胜感激

【问题讨论】:

    标签: sql sql-server sql-server-express


    【解决方案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”
    猜你喜欢
    • 2019-11-10
    • 2018-01-25
    • 1970-01-01
    • 1970-01-01
    • 2018-10-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多