簡體   English   中英

如何有效地從臨時表中提取多個值?

[英]How do I efficiently extract multiple values from a temporary table?

我正在嘗試根據行號提取各種值並將其存儲到變量中,以便以后可以將這些變量用於某些分析。 當前,我需要從按順序輸入表格的日期開始的前7行中獲取值。 使用以下代碼,我可以獲得所需的特定值:

WITH tempTable AS
(
    SELECT date, ROUND( SUM(size / 1024 / 1024 ) ) AS Size_Used FROM storageTable
    group by date
    order by date DESC
)
SELECT Size_Used INTO lastRowMinus0Value FROM
(
    SELECT Size_Used, ROWNUM AS rn FROM
    (
        SELECT Size_Used FROM tempTable
        ORDER BY date DESC
    )
)
WHERE rn = lastRowMinus0;

但是,這樣做的效率非常低,因為每個變量都重復了此代碼,因此編譯時間很長。

我以為可能使UNION ALL成為提高代碼效率的方法,但是在嘗試運行它時,我總是遇到編譯錯誤:

WITH tempTable AS
(
    SELECT date, ROUND( SUM(size / 1024 / 1024 ) ) AS Size_Used FROM storageTable
    group by date
    order by date DESC
)
SELECT Size_Used INTO lastRowMinus0Value FROM tempTable
WHERE ROWNUM = lastRowMinus0
UNION ALL
SELECT Size_Used INTO lastRowMinus1Value FROM tempTable
WHERE ROWNUM = lastRowMinus1;

如果有人可以就如何以更有效的方式提取值提供一些指導,我將不勝感激。

UNION ALL會給出一個結果,其中包含第一查詢和第二查詢的所有行的總和。 您不能將其結果存儲到單獨的變量中。

如果您確實要使用UNION ALL則應采用以下方法:

WITH TEMPTABLE AS (
    SELECT
        DATE,
        ROUND(SUM(SIZE / 1024 / 1024)) AS SIZE_USED
    FROM
        STORAGETABLE
    GROUP BY
        DATE
    ORDER BY
        DATE DESC
)
SELECT
    SUM(CASE ROWNUM
        WHEN LASTROWMINUS0   THEN SIZE_USED
    END),
    SUM(CASE ROWNUM
        WHEN LASTROWMINUS1   THEN SIZE_USED
    END)
INTO
    LASTROWMINUS0VALUE,
    LASTROWMINUS1
FROM
    TEMPTABLE
WHERE
    ROWNUM IN (
        LASTROWMINUS0,
        LASTROWMINUS1
    );

干杯!!

嘗試PIVOT

DECLARE
  lastRowMinus0 NUMBER;
  lastRowMinus1 NUMBER;
  lastRowMinus2 NUMBER;
  lastRowMinus3 NUMBER;
  lastRowMinus4 NUMBER;
  lastRowMinus5 NUMBER;
  lastRowMinus6 NUMBER;
BEGIN
  WITH t1 AS (SELECT
                ROUND(SUM("size" / 1024 / 1024)) Size_Used,
                ROW_NUMBER() OVER(ORDER BY "date" DESC) rn
              FROM storageTable
              GROUP BY "date")
  SELECT
    "1", "2", "3", "4", "5", "6", "7"
    INTO lastRowMinus0, lastRowMinus1, lastRowMinus2, lastRowMinus3,
         lastRowMinus4, lastRowMinus5, lastRowMinus6
  FROM (SELECT * FROM t1 WHERE rn < 8) t2
  PIVOT(SUM(Size_Used) FOR rn IN(1, 2, 3, 4, 5, 6, 7)) p;

  DBMS_OUTPUT.PUT_LINE('lastRowMinus0: '||lastRowMinus0||CHR(10)||
                       'lastRowMinus1: '||lastRowMinus1||CHR(10)||
                       'lastRowMinus2: '||lastRowMinus2||CHR(10)||
                       'lastRowMinus3: '||lastRowMinus3||CHR(10)||
                       'lastRowMinus4: '||lastRowMinus4||CHR(10)||
                       'lastRowMinus5: '||lastRowMinus5||CHR(10)||
                       'lastRowMinus6: '||lastRowMinus6);
END;

使用db <> fiddle在線對其進行測試。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM