以下哪个查询是优化/首选的

时间:2016-09-03 12:57:41

标签: mysql sql database

考虑两个表 tableA和tableB

TABLEA

| ID | driver_id | vehicle_id | is_allowed | license_number | DRIVER_NAME |

tableB的

| ID | driver_id | vehicle_id |罪行| 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

哪种类型的查询可读,优化且符合标准。

2 个答案:

答案 0 :(得分:1)

正确的版本如下所示:

SELECT a.driver_id, a.vehicle_id
FROM tableA a JOIN
     tableB b
     ON a.driver_id = b.driver_id AND 
        a.vehicle_id = b.vehicle_id
WHERE a.driver_name = 'XYZ' AND
      b.driver_name = 'XYZ' AND
      a.is_allowed = 1;

注意:

  • JOIN被认为是在FROM子句中组合表的正确方法。简单规则:从不FROM子句中使用逗号。
  • ON子句应包含包含多个表中列的所有谓词。
  • 使用表别名是一种偏好,使查询更容易编写和阅读。
  • 您可能希望使用INEXISTS,因为您的查询未从TableB返回列。
  • 不要在FROM子句中使用不必要的子查询。在某些数据库(尤其是MySQL)中,这会阻碍索引的使用,并增加了中间表实现的额外开销。

而且,您的问题的答案是第一个版本可能是优化版本(因为它不会不必要地实现子查询)。这两个版本都不是首选。

答案 1 :(得分:0)

第一个在标准和性能方面更好但是非常老式,所以它可以用这种方式编写

var seen = Set<String>()
var unique = [DisplayMessage]
for message in messagesWithDuplicates {
    if !seen.contains(message.id!) {
        unique.append(message)
        seen.insert(message.id!)
    }
}