Mysql 使用联接和子查询从两个表中获取行

Mysql 使用联接和子查询从两个表中获取行,mysql,sql,sql-server,Mysql,Sql,Sql Server,我有一张人的表格 人员ID、人员姓名 另一张人车关系表 PV_ID、人员ID、车辆ID、角色 我想建立一个查询,在其中我可以得到 PV\u ID、人员\u姓名 其中车辆ID=3,角色为“驾驶员” 我试着以下面的方式加入,但不起作用。如何获得所需的数据 Select Persons.Person_Name , Person_Vehicle_Relation.PV_ID from Persons inner join Person_Vehicle_relations on Persons.P

我有一张
人的表格

人员ID、人员姓名

另一张
人车关系表

PV_ID、人员ID、车辆ID、角色

我想建立一个查询,在其中我可以得到

PV\u ID、人员\u姓名

其中车辆ID=3,角色为“驾驶员”

我试着以下面的方式加入,但不起作用。如何获得所需的数据

Select Persons.Person_Name , Person_Vehicle_Relation.PV_ID
 from Persons  
 inner join Person_Vehicle_relations on Persons.Person_ID = (select Person_ID from Person_Vehicle_relations where Vehicle_ID = 3 and Role= 'driver')
错误是

Msg 512,16级,状态1,第1行 子查询返回了多个值。当子查询在=、!=、=或者当子查询用作表达式时


为什么需要子查询/内联视图?一个简单的工作地点

SELECT P.Person_Name , PVR.PV_ID
FROM Persons P
INNER join Person_Vehicle_relations  PVR
   on P.Person_ID = PRV.Person_ID
WHERE PVR.Vehicle_ID = 3 
  and PVR.Role= 'driver'
出现错误的原因是子查询返回了多个person,person的单个person_ID无法与PVR中的多个person匹配

您可以将它切换到“IN”而不是“=”,它也应该可以工作;但是连接和where子句似乎是最容易维护和运行的


一个人通常在PK/FK关系上加入,然后在where或having中应用限制。当我需要完成聚合时,我通常只使用子查询/内联视图而不是直接连接,并且M-M关系会人为地扩大聚合。当我不需要第二个表中的数据时,我也可以在交叉应用或存在中使用子查询。在这种情况下,您需要两个表中的数据,因此联接似乎是最好的。

错误消息非常清楚。子查询返回多行。=只能比较一个值。如果需要多行比较,请在中替换为
。同时正确标记。它不是MySQL就是SQL Server,不能两者都是。