我有以下表格和数据。
错误
bug_id creator category_id change_request_id
1 john 101 123
2 mark 124 124
3 mark 139 135
4 shane 167 148
6 logan 278 234
分类
id owner category_name
101 mark abc
124 john def
139 mark ghi
167 mark jkl
278 mark mno
Change_request
id creator
123 mark
124 mark
135 mark
148 john
234 mark
我需要从bug表中提取所有错误,其创建者字段值为john或其类别所有者为john(除了类别表的所有者字段)或其change_request“creator”为john。
我写了一个简单的select语句来实现这个
SELECT bug_id
FROM bugs
,category
,change_request
WHERE ((bugs.creator = 'john'
)
OR ((bugs.category_id = category.id
)
AND (category.owner = 'john'
)
)
OR ((bugs.change_request_id = change_request.id
)
AND (change_request.creator = 'john'
)
)
);
但是当我使用上面的查询时,执行时间太长。我的所有表列都已正确编入索引。是否有优化的查询来解决我的目的?
答案 0 :(得分:2)
查询优化器可以更轻松地处理这个问题:
SELECT bug_id
FROM bugs
JOIN category ON bugs.category_id = category.id
JOIN change_request ON bugs.change_request_id = change_request.id
WHERE (bugs.creator = 'john')
OR (category.owner = 'john')
OR (change_request.creator = 'john');
您可以使用逗号运算符和WHERE
谓词编写相同的内容,但生成的where子句与您的相同(尽管它会以相同的方式进行评估)。
答案 1 :(得分:1)
要添加到John Bollinger的答案中,为什么花费太长时间的原因是因为笛卡尔加入了WHERE
子句。 <{1}}子句中的OR
使连接条件不是必需的。
例如,如果WHERE
为bugs.creator
,则会忽略您的其他谓词,从而导致{<1>}记录与 所有 相关联JOHN
和JOHN
表中的记录。
John的查询会删除这种不良影响,因为它正确地将连接条件和过滤器谓词放在它们所属的位置。