选择中存在子查询的情况的替代方案

时间:2017-06-14 12:41:27

标签: sql select subquery query-optimization case-when

我对select子句中的CASE WHEN表达式有几个问题。我有兴趣知道如何在数据库中执行这些查询,以及是否有其他方法来编写此类查询。

我在select子句中有CASE WHEN的查询,如下所示:

SELECT
 (CASE WHEN cond1 THEN col2 ELSE NULL END),
 (CASE WHEN cond2 THEN col3 ELSE NULL END),
 (CASE WHEN cond3 THEN col4 ELSE NULL END), ...,
 simple-col-expr-list ... FROM
table-expr-list WHERE expr-list ...

CASE WHEN表达式中的条件具有以下形式:

  1. T1.some_column = some_value
  2. exists(select 1 from T2 where some conditions on columns from T2)
  3. exists(select 1 from T2 where T2.key1 = T1.key1 and optionally more conditions on other columns from T2)
  4. exists(select 1 from T1 as alias_T1 where alias_T1.key1 = T1.key1 and optionally some conditions on other columns from T1)
  5. exists(select 1 from T2 join T3 on (T2.key1 = T3.key1) join T1 as alias_T1 on (alias_t1.key2 = T2.key2)) 等等..

  6. 从上面分离出两种或更多种情况

  7. 在示例1中,条件是检查要投影的另一列或同一列中的值。在示例2到5中,CASE WHEN条件存在于一个或多个表上的子查询,它们可能是也可能不是相关的子查询。

    据我所知,列上的CASE WHEN表达式将在列的每一行上进行评估,这将针对每一列进行。特别是,如果两列具有相同的CASE WHEN条件,则将分别检查列和所有行的条件。

    是否有任何数据库系统(例如mysql,postgresql,oracle等)都有启发式方法来优化此类查询的查询计划,他们可以在内部为这两个列执行一次检查?如果CASE WHEN表达式没有相关的子查询,那么我相信可能有办法做到这一点。有人能指出一些解释这些优化的来源吗?如果它们存在的话?

    我还想知道是否存在关于如何在查询中重写此类CASE WHEN表达式以使源查询本身更有效的通用规则。

    由于

0 个答案:

没有答案