【问题标题】:Using Global Temporary Table in Subquery gives NULL在子查询中使用全局临时表给出 NULL
【发布时间】:2023-03-14 00:40:01
【问题描述】:

我正在使用以下查询。

SELECT  SYSDATE,(SELECT P_PRICE_OPEN FROM GTT_ADJ_PRICE_TABLE WHERE FSYM_ID='P8R3C2-R' AND P_DATE='22-OCT-18' AND P_VOLUME<>0 AND ROWNUM=1) FROM DUAL;

GTT_ADJ_PRICE_TABLE 是全局临时表,当我执行与之相关的函数时加载了值。此 GTT 在提交后保留行。这个查询给了我正确的结果。

但是,如果我运行查询

SELECT WEEK_END, WEEK_START, 
        (SELECT P_PRICE_OPEN FROM GTT_ADJ_PRICE_TABLE WHERE P_DATE=WEEK_START) AS WEEKS_OPEN_PRICE,
        (SELECT MAX(P_PRICE_HIGH) FROM GTT_ADJ_PRICE_TABLE WHERE FSYM_ID=FID AND P_DATE<=WEEK_END 
                AND P_DATE>=WEEK_START AND P_VOLUME<>0) AS WEEKLY_HIGH,
         (SELECT MIN(P_PRICE_LOW) FROM GTT_ADJ_PRICE_TABLE WHERE FSYM_ID=FID AND P_DATE<=WEEK_END 
                AND P_DATE>=WEEK_START AND P_VOLUME<>0) AS WEEKLY_LOW,
        (SELECT SUM(P_VOLUME) FROM GTT_ADJ_PRICE_TABLE WHERE FSYM_ID=FID AND P_DATE<=WEEK_END 
                AND P_DATE>=WEEK_START AND P_VOLUME<>0) AS WEEKLY_VOLUME,
        P_PRICE 
FROM (
       SELECT ROWNUM,FID,WEEK_END,P_VOLUME,P_PRICE,
                 (SELECT P_DATE FROM FP_V2_FP_BASIC_PRICES WHERE FSYM_ID=FID AND P_DATE>=TRUNC(WEEK_END, 'IW') AND P_VOLUME<>0 AND ROWNUM=1) AS WEEK_START
       FROM (
              SELECT 
                    ROWNUM,FSYM_ID AS FID, WEEK_END,P_VOLUME, P_PRICE,P_PRICE_OPEN,P_PRICE_HIGH,P_PRICE_LOW
              FROM (
                     SELECT ROWNUM,FSYM_ID,P_DATE AS WEEK_END, P_PRICE,P_VOLUME, P_PRICE_OPEN,P_PRICE_HIGH,P_PRICE_LOW,
                            CASE 
                                 WHEN (TO_CHAR(P_DATE,'D') >= AVG(TO_CHAR(P_DATE,'D')) OVER (order by P_DATE DESC rows between 1 preceding and current row) and ROWNUM>=1)  or TO_CHAR(P_DATE,'D')=6
                                 THEN 1
                                 ELSE 0
                            END AS WEEKFLAG
                     FROM(
                           SELECT * FROM TABLE (ADJUSTED_PRICE('P8R3C2-R')) WHERE P_VOLUME<>0
                         ) 
                    )WHERE WEEKFLAG=1
             )
      );

它在 WEEKS_OPEN_PRICE、WEEKLY_HIGH、WEEKLY_LOW、WEEKLY_VOLUME 中给我 NULL。 请帮我解决问题。感谢期待。

【问题讨论】:

  • @XING 如果我使用 select * FROM GTT_ADJ_PRICE_TABLE; 我会收到查询行数为 8000+。
  • 你的查询真的很难理解,写的不是很好。如果您显示您的输入内容和预期输出内容,那么任何人都可以更轻松地回复。
  • @XING 有一个名为 ADJUSTED_PRICE('P8R3C2-R') 的函数将值加载到名为 GTT_ADJ_PRICE_TABLE 的 GTT。同样,我试图获得 11 周和 40 周的平均值以及每周的高点和低点。如果仍然不明白,我可以尝试缩短我的查询并只保留必要的部分。
  • 可读性是一项功能。您的查询布局不正确,这意味着我们无法在不滚动的情况下阅读它。而且它完全是大写的,这使得它更难阅读。您的查询似乎不必要地复杂,因为它具有可疑数量的嵌套子查询。最后,您还没有解释您要实现的业务逻辑。如果您希望人们花时间帮助您,您应该降低理解您的查询所涉及的挑战级别。您永远不会知道,重新编写查询以使其易于理解可能会引导您找到您寻求的答案。
  • @APC 我已经更新了查询以便更好地理解。为之前的输入道歉。

标签: oracle plsql subquery


【解决方案1】:

尝试使用WITH 子句。我希望下面的查询有效。我没有可能检查。

WITH adjustedPrice AS (
   SELECT *
     FROM TABLE(adjusted_price('P8R3C2-R'))
    WHERE p_volume <> 0
      AND TO_CHAR(p_date, 'DY') NOT IN ('SAT', 'SUN') 
)
SELECT ap.week,
       ap.week_start,
       ap.week_end,
       ap.weeks_high_price,
       ap.weeks_low_price,
       ap.weekly_volume,
       ws.p_price_open AS weeks_open_price,
       we.p_price      AS weeks_close_price
  FROM (
         SELECT TRUNC(p_date, 'IW') AS week,
                TRUNC(MIN(p_date))  AS week_start,
                TRUNC(MAX(p_date))  AS week_end,
                MAX(p_price_high)   AS weeks_high_price,
                MIN(p_price_low)    AS weeks_low_price,
                SUM(p_volume)       AS weekly_volume
           FROM adjustedPrice
          GROUP BY TRUNC(p_date, 'IW')
        ) ap
 INNER JOIN adjustedPrice ws ON ws.p_date = ap.week_start 
 INNER JOIN adjustedPrice we ON we.p_date = ap.week_end
ORDER BY week DESC;

【讨论】:

  • 这确实对我有用。只需删除 AND TO_CHAR(p_date, 'DY') NOT IN ('SAT', 'SUN') 并编辑您的答案。我检查了数据库,我没有任何周六或周日的日期。您的查询也很省时。非常感谢您的回复。
【解决方案2】:

想发表评论。但它不适合那里,这就是为什么写它作为答案。

我尝试使用此代码来获取周开始、结束、周最高价、周最低价、周成交量。

              select
                        trunc("P_DATE", 'IW') as week,
                        min(trunc("P_DATE")) as week_start,
                        max(trunc("P_DATE")) as week_end,
                        MAX(P_PRICE_HIGH) AS WEEKS_HIGH_PRICE,
                        MIN(P_PRICE_LOW) AS WEEKS_LOW_PRICE,
                        SUM(P_VOLUME) AS WEEKLY_VOLUME
            from TABLE 
                        (ADJUSTED_PRICE('P8R3C2-R')) 
            WHERE 
                        P_VOLUME<>0 AND to_char("P_DATE", 'DY') not in ('SAT','SUN')
            group by 
                        trunc("P_DATE", 'IW')
            ORDER BY 
                        trunc("P_DATE", 'IW') DESC;

这给了我几乎 2-4 秒的结果。但我想获得日期等于 WEEK_START 的周开盘价和日期等于 WEEK_END 的周收盘价。

我尝试了以下方法。但它花费了太多时间(比如 300 多秒)。

SELECT 
        WEEK,WEEK_START, WEEK_END, WEEKS_HIGH_PRICE,WEEKS_LOW_PRICE,WEEKLY_VOLUME,
        (SELECT P_PRICE_OPEN FROM TABLE  (ADJUSTED_PRICE('P8R3C2-R')) WHERE P_VOLUME<>0 AND P_DATE=WEEK_START) AS WEEKS_OPEN_PRICE,
        (SELECT P_PRICE FROM TABLE  (ADJUSTED_PRICE('P8R3C2-R')) WHERE P_VOLUME<>0 AND P_DATE=WEEK_END) AS WEEKS_CLOSE_PRICE
FROM
        (
            select
                        trunc("P_DATE", 'IW') as week,
                        min(trunc("P_DATE")) as week_start,
                        max(trunc("P_DATE")) as week_end,
                        MAX(P_PRICE_HIGH) AS WEEKS_HIGH_PRICE,
                        MIN(P_PRICE_LOW) AS WEEKS_LOW_PRICE,
                        SUM(P_VOLUME) AS WEEKLY_VOLUME
            from TABLE 
                        (ADJUSTED_PRICE('P8R3C2-R')) 
            WHERE 
                        P_VOLUME<>0 AND to_char("P_DATE", 'DY') not in ('SAT','SUN')
            group by 
                        trunc("P_DATE", 'IW')
            ORDER BY 
                        trunc("P_DATE", 'IW') DESC
        );

如果有人可以帮助我改善输出时间,我们非常欢迎。

【讨论】:

    猜你喜欢
    • 2011-12-14
    • 2023-04-08
    • 1970-01-01
    • 1970-01-01
    • 2012-11-21
    • 1970-01-01
    • 1970-01-01
    • 2017-10-02
    • 2023-03-27
    相关资源
    最近更新 更多