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

「CNT、SUMT、DT_G」はインラインビューのエイリアスだと思います。

于 2013-06-18T06:37:00.393 に答える
1

この select には複数のサブクエリが埋め込まれており、基本的には括弧で囲まれたすべての select をビューとして扱います (つまり、正確にはテーブルではありませんが、データはテーブルとして表示されます)。

これを評価する方法は、命令型プログラミング言語 (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

したがって、これ以降、以前の選択からの RSC_SNO 列を参照する CNT.RSC_SNO を参照することができます。

これ以降、CNT はその最初のクエリを表すことになることを覚えておいてください。

2番目: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 に答える