从列列表中删除选择子查询到主查询

Posted

技术标签:

【中文标题】从列列表中删除选择子查询到主查询【英文标题】:Remove select subquery from column list to main query 【发布时间】:2018-11-05 06:54:01 【问题描述】:

查询 1(之前):

select ta.C1,
       (SELECT tb.C1 from T2 tb WHERE  tb.C2 = ta.C2)
from T1 ta
WHERE ta.C3=30025239;

我想从列级别删除子查询。 我修改了代码添加加入

查询 2(之后):

select ta.C1, tb.C1
from T1 ta left outer join
     T2 tb 
     on tb.C2 = ta.C2
WHERE ta.C3=30025239;

但如果子查询返回空白(无值),则查询 1 为 ta.C1 返回数据,为 tb.C1 返回空值,而查询 2 将返回空白(无结果)。 我希望查询 2 的结果与查询 1 相同

【问题讨论】:

请创建一个DB Fiddle 展示您的声明。您的数据还有其他问题。 @GordonLinoff 帖子应使用use text, not images/links, for text (including code, tables & ERDs)。请不要不恰当地内联链接。要么用代码块格式的表格文本替换到表格的链接(如果问题应该给出minimal reproducible example,那么它应该同时是创建和初始化表格的代码),或者更好的是,评论告诉发布者这样做。 请不要删除和转发问题,请编辑它们。请使用文本而不是图像/链接作为文本,包括表格。无论如何,这些表应该是minimal reproducible example 中的代码——我们上次要求你提供。你还是不清楚——“用足够多的词和句子来清楚。” 【参考方案1】:

为什么您认为您的两个查询给出了不同的响应?它们是等价的:

WITH t1 AS (SELECT 1 c1, 10 c2, 30025239 c3 FROM dual UNION ALL
            SELECT 2 c1, 20 c2, 30025239 c3 FROM dual UNION ALL
            SELECT 3 c1, 30 c2, 30025238 c3 FROM dual),
     t2 AS (SELECT 100 c1, 10 c2 FROM dual UNION ALL
            SELECT 300 c1, 30 c2 FROM dual)
select 'query 1' qry, ta.C1 ta_c1, (SELECT tb.C1 from T2 tb WHERE  tb.C2 = ta.C2) tb_c1
from T1 ta WHERE ta.C3=30025239
UNION ALL
select 'query 2' qry, ta.C1, tb.C1
from T1 ta left outer join T2 tb on tb.C2 = ta.C2
WHERE ta.C3=30025239;

QRY          TA_C1      TB_C1
------- ---------- ----------
query 1          1        100
query 1          2 
query 2          1        100
query 2          2 

与查询 2 的唯一区别是,您不再从查询 1 中获得的标量子查询缓存中受益。如果 ta.c2 列是唯一的或不包含许多重复值,这可能无关紧要.

【讨论】:

【参考方案2】:

两个查询都是一样的。但是,有问题的查询及其输出列是不同的。您的查询中可能有更多条件会更改输出。

【讨论】:

以上是关于从列列表中删除选择子查询到主查询的主要内容,如果未能解决你的问题,请参考以下文章

访问使用列表框中选择的项目更新子表单

如何在子查询的 WHERE 子句中使用来自 UNNEST 的多个值?

错误:不使用EXISTS引入子查询时,选择列表中只能指定一个表达式

通过子查询中的 id 列表选择条目?

相关子查询

子查询