选择语句上的NOOB查询

时间:2014-10-16 17:59:40

标签: sql oracle oracle11g oracle10g

我有以下表格和数据。

错误

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'
                     )
              )
       );

但是当我使用上面的查询时,执行时间太长。我的所有表列都已正确编入索引。是否有优化的查询来解决我的目的?

2 个答案:

答案 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使连接条件不是必需的。

例如,如果WHEREbugs.creator,则会忽略您的其他谓词,从而导致{<1>}记录与 所有 相关联JOHNJOHN表中的记录。

John的查询会删除这种不良影响,因为它正确地将连接条件和过滤器谓词放在它们所属的位置。