SQL查询和优化(十一)

不等连接的标量子查询改写

前面的例子中,标量子询查中都是等值的关联条件,能直接改为LEFT JOIN 或者汇总后再用LEFT JOIN,但遇到不等连接怎么办呢?
SELECT  a.licenceid,
        a.data_source,
        a.street,
        (SELECT MIN(contdata)
        FROM ct 
        WHERE ct.licenceid = a.licenceid
        AND ct.data_source = a.data_source
        AND trunc(contdate) >= a.opendaledate) AS mincontdata,
        (SELECT MIN(buydate)
        FROM ct
        WHERE ct.licenceid = a.licenceid
        AND ct.data_source = a.data_source
        AND trunc(buydate) >= a.opendaledate) AS minbuydate
    FROM a;

要想把两个量合并,必须要先与a表关联,这样才能在取最值前过滤
SELECT a.rowid AS rid,
        MIN(CASE WHEN trunc(ct.contdate) >= a.opendaledate) THEN
            ct.contdate END)AS mincontdate,
        MIN(CASE WHEN trunc(ct.buydate) >= a.opendaledate) THEN
            ct.buydate END)AS minbuydate
FROM ct
INNER JOIN a ON(ct.licenceid = a.licenceid
        AND ct.data_source = a.data_source)
GROUP BY a.rowid
到此标量部分搞定,再左联就可以了
WITH ct2 AS(
    SELECT a.rowid AS rid,
        MIN(CASE WHEN trunc(ct.contdate) >= a.opendaledate) THEN
            ct.contdate END)AS mincontdate,
        MIN(CASE WHEN trunc(ct.buydate) >= a.opendaledate) THEN
            ct.buydate END)AS minbuydate
    FROM ct
    INNER JOIN a ON(ct.licenceid = a.licenceid
        AND ct.data_source = a.data_source)
    GROUP BY a.rowid)
SELECT  a.licenceid,
        a.data_source,
        a.street,
        ct2.mincontdate AS mincontdate,
        ct2.minbuydate AS minbuydate
    FROM a
    LEFT JOIN ct2 ON(ct2.rid = a.rowid);

选自《Oracle 查询优化改写技巧与案例》 有教无类 落落 著

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值