不了解查询的某些部分

时间:2013-06-18 06:17:53

标签: sql oracle

您好我正在尝试分析此查询。 但我只是不明白)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

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

此选择中包含多个嵌入式子查询,基本上将括号括起的每个选择视为一个视图(换句话说,数据显示为表,即使它不完全是表)。

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

让我们看看他们。

首先:CNT

(
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进行make引用,CNT.RSC_SNO引用该previoius选择中的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'的地方?这需要处理前一个select就好像它在一个表中一样,所以你要根据之前的结果集进行选择 (实际上,在编写查询时,你应该包括整个'(...)CNT',但为了简单起见省略了它)

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