簡體   English   中英

從列列表中刪除選擇子查詢到主查詢

[英]Remove select subquery from column list to main query

查詢 1(之前):

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

結果查詢 1

我想從列級別刪除子查詢。 我修改了代碼以添加加入

查詢 2(之后):

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

結果查詢 2

但是,如果子查詢返回空白(無值),則查詢 1 為 ta.C1 返回數據,為 tb.C1 返回 null,而查詢 2 將返回空白(無結果)。 我希望查詢 2 的結果與查詢 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 列是唯一的或不包含許多重復值,這可能無關緊要。

兩個查詢是相同的。 但是,有問題的查詢及其輸出列是不同的。 您的查詢中可能有更多條件會更改輸出。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM