Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 具有查找表和链接表的一对多查询_Sql_Sql Server_Sql Server Express - Fatal编程技术网

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

Sql 具有查找表和链接表的一对多查询,sql,sql-server,sql-server-express,Sql,Sql Server,Sql Server Express,我当前的测试围绕一个假设数据库展开,该数据库由一个Person表组成,该表主要由查找表中的ID填充 我还有一个Training表,它还有一个Id链接到课程表。 我创建了一个名为personcontroling的链接表,它通过各自的ID链接Person和Training表 我的目标是返回结果表的查询 我可以创建一个查询,返回Person表,其中所有id都替换为各自的查找表值。本质上这是下面的,相信这是正确的方法吗 Select PersonId, Name, [DepartmentTab

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

我还有一个
Training
表,它还有一个
Id
链接到
课程
表。 我创建了一个名为
personcontroling
的链接表,它通过各自的ID链接
Person
Training

我的目标是返回结果表的查询

我可以创建一个查询,返回
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
但是,我不知道如何将这些信息连同他们参加的课程名称一起返回


任何帮助都将不胜感激。

不完全清楚“培训”和“课程”之间的区别是什么。。。那两张桌子是分开的吗?一对一的关系

但是,假设您希望扩展现有查询,以包括从
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”