使用join和sub查询从两个表中获取行

时间:2017-08-14 15:47:50

标签: mysql sql sql-server

我有一张Persons

的表格
  

Person_ID,Person_Name

Person_Vehicle_Relation

的另一个表格
  

PV_ID,Person_ID,Vehicle_ID,角色

我想构建一个查询,我可以在其中获取

列表
  

PV_ID,Person_Name

where Vehicle_ID= 3 and Role = 'Driver'

我尝试过以下方式加入,但它无效。我怎样才能得到我想要的数据?

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,Level 16,State 1,Line 1       子查询返回的值超过1。当子查询遵循=,!=,<,< =,>,> =或子查询用作表达式时,不允许这样做。

1 个答案:

答案 0 :(得分:3)

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

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_ID无法与PVR中的多个人匹配。

您可以将其切换为" IN"而不是" ="它也应该起作用;但是join和where子句似乎是最简单的维护和运行。

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