我有一张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。当子查询遵循=,!=,<,< =,>,> =或子查询用作表达式时,不允许这样做。
答案 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关系会人为地夸大聚合。当我不需要来自第二个表的数据时,我也可以在交叉应用或存在时使用子查询。在这种情况下,您需要来自两个表的数据,因此连接似乎是最好的。