0

您好我正在尝试分析此查询。但我就是不明白)CNT,)SUMT,)DT_G。

他们为什么要放这些,它们是什么意思?谁能解释一下?

 (
     SELECT 
                                 NVL(DT_G.COMM_DT, 'TOTAL') COMM_DT
                                ,NVL(SUM(DT_G.MOVIE_500K), 0) AS MOVIE_500K
                                ,NVL(SUM(DT_G.MOVIE_1M), 0) AS MOVIE_1M
                                ,NVL(SUM(DT_G.MOVIE), 0) AS MOVIE
                                ,NVL(SUM(DT_G.EXAM), 0) AS EXAM
                                ,NVL(SUM(DT_G.DOC), 0) AS DOC 
                                ,NVL(SUM(DT_G.IMG), 0) AS IMG
                                ,NVL(SUM(DT_G.WEB), 0) AS WEB
                                ,NVL(SUM(DT_G.INTERRAC), 0) AS INTERRAC
                       FROM 
                                (
                                 SELECT
                                              COMM_DT
                                            , CASE SUMT.RSC_TP_DSCD WHEN 'RTP10' THEN SUMT.SUM_500K END MOVIE_500K
                                            , CASE SUMT.RSC_TP_DSCD WHEN 'RTP10' THEN SUMT.SUM_1M END AS MOVIE_1M
                                            , CASE SUMT.RSC_TP_DSCD WHEN 'RTP10' THEN SUMT.SUM_500K+SUMT.SUM_1M END AS MOVIE
                                            , CASE SUMT.RSC_TP_DSCD WHEN 'RTP11' THEN SUMT.SUM_STD_CNT END AS EXAM
                                            , CASE SUMT.RSC_TP_DSCD WHEN 'RTP12' THEN SUMT.SUM_STD_CNT END AS DOC
                                            , CASE SUMT.RSC_TP_DSCD WHEN 'RTP13' THEN SUMT.SUM_STD_CNT END AS IMG
                                            , CASE SUMT.RSC_TP_DSCD WHEN 'RTP14' THEN SUMT.SUM_STD_CNT END AS WEB
                                            , CASE SUMT.RSC_TP_DSCD WHEN 'RTP01' THEN SUMT.SUM_STD_CNT END AS INTERRAC
                                  FROM (

SELECT RSC_TP_DSCD, SUM(STDY_CNT) AS SUM_STD_CNT, SUM(MOVIE_STDY_CNT_N1M) AS SUM_1M, SUM(MOVIE_STDY_CNT_N500K) AS SUM_500K, COMM_DT
    FROM (
            SELECT RSC_SNO, STDY_CNT, MOVIE_STDY_CNT_N1M, MOVIE_STDY_CNT_N500K, COMM_DT
               FROM LRMS.V_EBSM_PKG_RSC_COMM_CNT
            WHERE PKG_SNO = 0  AND RSC_SNO != 0
            AND COMM_DT BETWEEN TO_CHAR(TO_DATE('20130501', 'YYYY-MM-DD'), 'YYYYMMDD') AND TO_CHAR(TO_DATE('20130530', 'YYYY-MM-DD'), 'YYYYMMDD')
            ) CNT
         LEFT OUTER JOIN LRMS.V_LRRM_RSC RSC ON CNT.RSC_SNO = RSC.RSC_SNO
    GROUP BY RSC_TP_DSCD, COMM_DT
     ) SUMT
   ) DT_G
 GROUP BY ROLLUP(DT_G.COMM_DT)
) RSC ON DAY.DAY = RSC.COMM_DT
4

2 回答 2

1

这个选择有多个嵌入的子查询,基本上将每个用括号括起来的选择视为一个视图(换句话说,数据被显示为一个表格,即使它不完全是一个表格)。

您评估它的方式类似于在命令式编程语言(如 C 或 Java)中进行函数调用的方式。您首先评估最里面的查询。

让我们看看他们。

第一:碳纳米管

(
SELECT RSC_SNO, STDY_CNT, MOVIE_STDY_CNT_N1M, MOVIE_STDY_CNT_N500K, COMM_DT
FROM LRMS.V_EBSM_PKG_RSC_COMM_CNT
WHERE PKG_SNO = 0  AND RSC_SNO != 0
    AND COMM_DT BETWEEN TO_CHAR(TO_DATE('20130501', 'YYYY-MM-DD'), 'YYYYMMDD') AND TO_CHAR(TO_DATE('20130530', 'YYYY-MM-DD'), 'YYYYMMDD')
    ) CNT

这是要评估的第一个子查询。从现在开始,子查询将被视为一个视图(再次将选择查询数据结果表示为一个表),称为 CNT。此 CNT 将具有以下列:

RSC_SNO, STDY_CNT, MOVIE_STDY_CNT_N1M, MOVIE_STDY_CNT_N500K, COMM_DT

因此,从现在开始,您可以参考 CNT.RSC_SNO,它指的是之前选择的 RSC_SNO 列。

请记住,从现在开始,CNT 将代表第一个查询。

第二:SUMT

    (
SELECT RSC_TP_DSCD, SUM(STDY_CNT) AS SUM_STD_CNT, SUM(MOVIE_STDY_CNT_N1M) AS SUM_1M, SUM(MOVIE_STDY_CNT_N500K) AS SUM_500K, COMM_DT
FROM CNT
    LEFT OUTER JOIN LRMS.V_LRRM_RSC RSC ON CNT.RSC_SNO = RSC.RSC_SNO
GROUP BY RSC_TP_DSCD, COMM_DT
    ) SUMT

看到我在哪里写了“FROM CNT”吗?这需要像处理表一样处理先前的选择,因此您正在根据先前的结果集进行选择(实际上,在编写查询时,您应该包括整个 '(...) CNT' 但是为简单起见省略)

在每个子查询中继续应用相同的逻辑,这就是您的查询正在做的事情。

于 2013-06-18T06:56:35.347 回答
1

我相信“CNT、SUMT、DT_G”是内联视图的别名。

于 2013-06-18T06:37:00.393 回答