已知Driver表ID为入参,编写多表关联SQL判断车辆居住国是否为美国
你写的SQL存在几处明显问题:
- 语法逻辑错误:将查询居住国的子查询直接放在WHERE子句中当作表使用,不符合SQL的语法规则
- 条件完全写反:你的需求是匹配居住国为美国的场景才返回1,你写的条件反而把居住国是美国的场景排除了
- 字段匹配大小写错误:VehicleCountry表中存储的字段名是
Residence Country,你写的全大写的RESIDENCE COUNTRY在大小写敏感的数据库中会匹配不到记录 - 存在冗余的表关联:如果没有校验车辆可用性的额外需求,Vehicle表可以不用关联,Driver表拿到vehicleId后可以直接关联VehicleCountry表
下面是符合需求的正确写法:
SELECT 1 FROM Driver ies INNER JOIN VehicleCountry vc ON ies.vehicleId = vc.vehicleId WHERE ies.id = :GID AND vc.VehicleField = 'Residence Country' AND vc.VehicleValue = 'USA' LIMIT 1;
如果你的业务要求必须校验车辆状态为可用,可以加上Vehicle表的关联:
SELECT 1 FROM Driver ies INNER JOIN Vehicle v ON ies.vehicleId = v.vehicleId INNER JOIN VehicleCountry vc ON ies.vehicleId = vc.vehicleId WHERE ies.id = :GID AND v.VehicleAvl = 'Yes' AND vc.VehicleField = 'Residence Country' AND vc.VehicleValue = 'USA' LIMIT 1;
以上查询逻辑清晰:传入Driver的ID后,找到对应的车辆,匹配该车辆居住国为美国的记录,匹配到就返回1,没有匹配到就无返回结果,刚好满足你的需求。加LIMIT 1是为了避免极端情况下同一车辆有多条居住国记录时返回多行,如果你能保证VehicleCountry表同一个vehicleId同一个VehicleField只有一条记录可以省略。
内容的提问来源于stack exchange,提问作者Vikram Srinivasan
相关产品推荐
相关产品推荐

