暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Oracle 子查询执行

askTom 2017-05-23
188

问题描述

你好,

我有这样的sql:
SELECT CASE a.x
         WHEN 'b' THEN (SELECT b.y FROM b WHERE b.id = a.b_id)
         WHEN 'c' THEN (SELECT c.y FROM c WHERE c.id = a.c_id)
         WHEN 'd' THEN (SELECT d.y FROM d WHERE d.id = a.d_id)
       END
  FROM a


问题是,如果case语句中的所有3个子查询都将被执行,或者只有一个满足condtition?
从我在执行计划中看到的内容来看,似乎所有3个子查询都将被执行。

专家解答

很容易证明我们不会全部运行它们,例如

SQL> create table a ( x char(1));

Table created.

SQL> insert into a values ('b');

1 row created.

SQL>
SQL> create table b ( y int );

Table created.

SQL> insert into b values (1);

1 row created.

SQL>
SQL> SELECT CASE a.x
  2           WHEN 'b' THEN (SELECT b.y FROM b )
  3           WHEN 'c' THEN (SELECT y/0 FROM b )
  4           WHEN 'd' THEN (SELECT y/0 FROM b )
  5         END
  6    FROM a;

CASEA.XWHEN'B'THEN(SELECTB.YFROMB)WHEN'C'THEN(SELECTY/0FROMB)WHEN'D'THEN(SELECTY/0FROMB)END
-------------------------------------------------------------------------------------------
                                                                                          1

1 row selected.



没有零除法错误。
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论