【发布时间】:2017-01-11 10:35:19
【问题描述】:
考虑两个表 表A和表B
表A
|id|driver_id|vehicle_id|is_allowed|license_number|driver_name|
表B
|id|driver_id|vehicle_id|offence|payable_amount|driver_name|
目标:找到名称为 XYZ 的允许司机的 driver_id 和 vehicle_id。
Query1:SELECT * FROM tableA,tableB {join-condition}{filter-condition}
SELECT tableA.driver_id,tableA.vehicle_id FROM tableA,tableB
WHERE
tableA.driver_id=tableB.driver_id AND
tableA.vehicle_id=tableB.vehicle_id AND
tableA.driver_name='XYZ' AND
tableB.driver_name='XYZ' AND
tableA.is_allowed = 1
Query2:SELECT * FROM (SELECT * FROM tableA {filter-condition}) JOIN (SELECT * FROM tableB {filter-condition}) ON {join-condition}{filter-condition}
SELECT tableAA.driver_id,tableAA.vehicle_id FROM
(SELECT tableA.driver_id,tableA.vehicle_id from tableA WHERE tableA.driver_name='XYZ' AND
tableA.is_allowed = 1) as tableAA,
JOIN
(SELECT tableB.driver_id,tableB.vehicle_id from tableB WHERE tableB.driver_name='XYZ') as tableBB
ON
tableAA.driver_id=tableBB.driver_id AND
tableAA.vehicle_id=tableBB.vehicle_id
哪种类型的查询是可读、优化和符合标准的。
【问题讨论】:
-
始终使用显式 JOIN 语法。第一个查询只是超级旧的遗留代码
-
不应该
tableA.driver_id=tableB.driver_id暗示tableA.driver_name=tableB.driver_name? -
我删除了不兼容的数据库标签。请为您真正使用的数据库添加标签。
-
@redneb,可能是也可能不是,因为两个值都可以由用户编辑,所以两个表可能有不同的名称。