烦人的标量加rownum = 1

根据sql构建表如下

DROP TABLE r;
CREATE TABLE r AS SELECT 1 AS singerid,1 AS songid FROM dual;
DROP TABLE s1;
CREATE TABLE s1 AS SELECT 1 AS areaid,'1' AS  singername,1 AS singerid,1 AS songid FROM dual;
DROP TABLE area;
CREATE TABLE area AS SELECT '1' AS  area,1 AS ID FROM dual;
DROP TABLE b;
CREATE TABLE b AS SELECT 1 AS price,1 AS distributionarea, 1 AS songid, '1' AS  showstatus,1 AS contentid,'6' AS subservicetype FROM dual;
DROP TABLE t;
CREATE TABLE t AS SELECT 1 AS downtime,1 AS sttime,1 AS songid FROM dual;
DROP TABLE s;
CREATE TABLE s AS
SELECT 1 AS songid,
       '1' AS songname,
       '1' AS LANGUAGE,
       1 AS stylelable,
       1 AS publishtime,
       1 AS basicsort,
       0 AS masked
  FROM dual;


原语句如下,标量一大堆,而且居然还有rownum<=1

SELECT s.songid songid,
       s.songname songname,
       s.language,
       s.publishtime songpublishtime,
       s.stylelable songlabel,
       s.basicsort songbasicsort,
       (SELECT to_char(wm_concat(s1.singername))
          FROM r r, s1 s1
         WHERE r.singerid = s1.singerid
           AND r.songid = s.songid
           AND rownum = 1) singername,
       (SELECT to_char(wm_concat(a.area))
          FROM r r, s1 s1, area a
         WHERE r.singerid = s1.singerid
           AND s1.areaid = a.id(+)
           AND r.songid = s.songid
           AND rownum = 1) singerarea,
       (SELECT contentid
          FROM b b
         WHERE b.songid = s.songid
           AND b.showstatus IN ('1', '3')
           AND b.subservicetype = '6'
           AND rownum = 1) contentid,
       (SELECT contentid
          FROM b b
         WHERE b.songid = s.songid
           AND b.showstatus IN ('1', '3')
           AND b.subservicetype = '8'
           AND rownum = 1) ringcontentid,
       (SELECT contentid
          FROM b b
         WHERE b.songid = s.songid
           AND b.showstatus IN ('1', '3')
           AND b.subservicetype = '1'
           AND rownum = 1) mvcontentid,
       nvl((SELECT SUM(t.downtime)
             FROM t t
            WHERE t.songid = s.songid),
           0) downtime,
       nvl((SELECT SUM(t.sttime)
             FROM t t
            WHERE t.songid = s.songid),
           0) listentime,
       0 datasource
  FROM s s
 WHERE 1 = 1
   AND EXISTS (SELECT 1
          FROM b c
         WHERE c.songid = s.songid
           AND showstatus IN ('1', '3')
           AND rownum = 1)
   AND NOT EXISTS (SELECT 1
          FROM b c
         WHERE c.subservicetype = '8'
           AND c.price = '0'
           AND c.distributionarea != '99'
           AND c.distributionarea IS NOT NULL
           AND s.songid = c.songid)
   AND s.masked = 0   
/

几乎都要看晕了。去掉标量后如下

SELECT s.songid songid,
       s.songname songname,
       s.language,
       s.publishtime songpublishtime,
       s.stylelable songlabel,
       s.basicsort songbasicsort,
       r.singername,
       r.singerarea,
       c.contentid,
       c.ringcontentid AS ringcontentid,
       c.mvcontentid AS mvcontentid,
       nvl(t.downtime, 0) downtime,
       nvl(t.listentime, 0) listentime,
       0 datasource
  FROM s s
 INNER JOIN (SELECT c.songid,
                    MAX(CASE
                          WHEN c.subservicetype = '1' THEN
                           contentid
                        END) AS mvcontentid,
                    MAX(CASE
                          WHEN c.subservicetype = '8' THEN
                           contentid
                        END) AS ringcontentid,
                    MAX(CASE
                          WHEN c.subservicetype = '6' THEN
                           contentid
                        END) AS contentid
               FROM b c
              WHERE showstatus IN ('1', '3')
              GROUP BY c.songid) c
    ON (c.songid = s.songid)
  LEFT JOIN (SELECT t.songid,
                    SUM(t.downtime) AS downtime,
                    SUM(t.sttime) AS listentime
               FROM t t
              GROUP BY t.songid) t
    ON (t.songid = s.songid)
  LEFT JOIN (SELECT r.songid,
                    to_char(MAX(a.area)) AS singerarea,
                    to_char(MAX(s1.singername)) AS singername
               FROM r r, s1 s1, area a
              WHERE r.singerid = s1.singerid
                AND s1.areaid = a.id(+)
              GROUP BY r.songid) r
    ON (r.songid = s.songid)
 WHERE 1 = 1
   AND NOT EXISTS (SELECT 1
          FROM b c
         WHERE c.subservicetype = '8'
           AND c.price = '0'
           AND c.distributionarea != '99'
           AND c.distributionarea IS NOT NULL
           AND s.songid = c.songid)
   AND s.masked = 0



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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值