考虑两个表 tableA和tableB
目标:查找名称为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
哪种类型的查询可读,优化且符合标准。
答案 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
子句应包含包含多个表中列的所有谓词。IN
或EXISTS
,因为您的查询未从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!)
}
}