首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >where子句中的Oracle查询执行

问where子句中的Oracle查询执行
EN

Stack Overflow用户
提问于 2011-03-03 17:14:15
回答 2查看 833关注 0票数 2

我们正在尝试执行一个select查询,该查询在case语句中使用一个列名,如果where子句中使用了相同的列名,它将进入无限循环。

例如

代码语言:javascript
复制
select empId,empName,
        (case when empDept in ('A','B','C') then empAge
              when empDept in ('E','F','G') then empExp 
              else 'Dept-Not found' end) 
        from employee  where empDept in ('A','B','C','D','E','F','G')

即使我们将or子句放在where子句中而不是in子句中,也没有关系。

编辑:编辑查询

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-03-03 18:01:56

显然,还有其他一些事情正在发生。WHERE子句在SELECT (列列表)子句之前计算,它不可能产生无限循环。

考虑(10.2.0.1):

代码语言:javascript
复制
SQL> CREATE TABLE employee AS
  2  SELECT 1 empId, 'e1' empName, 1 empAge, 10 empExp, 'A' empDept FROM dual
  3  UNION ALL SELECT 2, 'e2', 2, 9, 'B' FROM dual
  4  UNION ALL SELECT 3, 'e3', 3, 8, 'C' FROM dual
  5  UNION ALL SELECT 4, 'e4', 4, 7, 'D' FROM dual
  6  UNION ALL SELECT 5, 'e5', 5, 6, 'E' FROM dual
  7  UNION ALL SELECT 6, 'e6', 6, 5, 'F' FROM dual;

Table created

SQL> select empId,empName,
  2          (case when empDept in ('A','B','C') then to_char(empAge)
  3                when empDept in ('E','F','G') then to_char(empExp)
  4                else 'Dept-Not found' end)
  5          from employee  where empDept in ('A','B','C','D','E','F','G');

     EMPID EMPNAME (CASEWHENEMPDEPTIN('A','B','C'
---------- ------- ----------------------------------------
         1 e1      1
         2 e2      2
         3 e3      3
         4 e4      Dept-Not found
         5 e5      6
         6 e6      5

正如您在我的示例中看到的,我必须向case表达式添加一个to_char,因为case的所有结果都必须具有相同的类型。在没有to_char的情况下,我得到了一台ORA-00932。也许当查询返回错误时,您的工具会挂起?

票数 4
EN

Stack Overflow用户

发布于 2011-03-03 21:03:02

根据您提供的少量信息,我可以说,如果没有WHERE子句,查询将执行全表扫描,但是当您添加WHERE子句时,它将切换到索引范围扫描。如果您感兴趣的六个部门的记录分布在整个表中,那么索引范围扫描的效率很可能比表扫描低得多。

造成这种情况的一个可能原因是表和索引上的统计数据已过时。

在任何情况下,诊断SQL性能问题的第一步都应该是查看执行计划。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5178688

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档