Sql 选择中存在子查询时的可选情况

Sql 选择中存在子查询时的可选情况,sql,select,subquery,query-optimization,case-when,Sql,Select,Subquery,Query Optimization,Case When,关于select子句中的CASE-WHEN表达式,我有几个问题。我很想知道这些查询通常是如何在数据库中执行的,以及是否有其他编写此类查询的方法 我对select子句中的CASE有如下疑问: 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

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

我对select子句中的CASE有如下疑问:

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 ...
表达式中的条件有以下形式:

T1.some_列=some_值 退出从T2中选择1,其中T2列上的某些条件 exists从T2中选择1,其中T2.key1=T1.key1,并且可以选择从T2中选择其他列上的更多条件 Exists从T1中选择1作为别名_T1,其中别名_T1.key1=T1.key1,并且可以选择从T1中选择其他列上的某些条件 Exists从T2中选择1连接T2上的T3.key1=T3.key1将T1连接为别名上的别名\u T1.key2=T2.key2 等等

上述两种或两种以上条件的析取

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

据我所知,列上的表达式将在列的每一行上求值,这将在每一列上完成。特别是,如果两列具有相同的CASE WHEN条件,则将分别对两列和所有行检查它们的条件

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

我还想知道,当查询中的表达式使源查询本身更高效时,是否有关于如何重写这种情况的通用规则


谢谢

请看一下我刚才回答的这个问题。这个问题基本上是一样的。正如您已经说过的,在您的例子中,子查询是针对每一行执行的。因此最好加入。谢谢您的回复。当条件为1、2和6时,我用更多的例子更新了这个问题,我不知道如何重写。另外,我不确定我是否正确地得到了作为左连接的重写。在表达式的情况下,返回空值的行,但使用左连接时,这些行被抑制。@fancyPants:行对行的影响可能对mySQL是正确的,但MSSQL和Oracle以及其他可能“足够聪明”,可以将执行计划优化为基本上也是左外部连接。总是写左外连接似乎是更好的选择,但根据我的经验,在不存在结构的地方更容易阅读和维护。此外,我还看到过几种情况,连接构造会无意中导致记录翻倍;同样地,一个不存在的构造将更能抵抗。请看一下我刚才回答的这个问题。这个问题基本上是一样的。正如您已经说过的,在您的例子中,子查询是针对每一行执行的。因此最好加入。谢谢您的回复。当条件为1、2和6时,我用更多的例子更新了这个问题,我不知道如何重写。另外,我不确定我是否正确地得到了作为左连接的重写。在表达式的情况下,返回空值的行,但使用左连接时,这些行被抑制。@fancyPants:行对行的影响可能对mySQL是正确的,但MSSQL和Oracle以及其他可能“足够聪明”,可以将执行计划优化为基本上也是左外部连接。总是写左外连接似乎是更好的选择,但根据我的经验,在不存在结构的地方更容易阅读和维护。此外,我还看到过几种情况,连接构造会无意中导致记录翻倍;同样地,一个不存在的构造将更能抵抗。