【问题标题】:Condition in WHERE clause (Oracle)WHERE 子句中的条件 (Oracle)
【发布时间】:2015-05-18 08:38:52
【问题描述】:

我需要一个根据月份/年份返回数据的查询。下面是我编写的一个子查询,它返回一行 - start_date 和 end_date 是我需要在我的主查询中使用的值

WITH SUBQ AS (SELECT 
    dim.MONTH_NAME as current_month_name
   ,dim.year_period as current_month
   ,dim.PERIOD_YEAR as YEAR
   ,CASE WHEN dim.year_period NOT LIKE '%01' THEN to_number(CONCAT(to_char(dim.PERIOD_YEAR-1) , '01' ))
         WHEN dim.year_period LIKE '%01'THEN to_number(CONCAT(to_char(dim.PERIOD_YEAR-2) , '01' ))
         END AS START_DATE 
   ,CASE WHEN dim.year_period NOT LIKE '%01' THEN to_number(CONCAT(to_char(dim.PERIOD_YEAR) , '01'  ))
         WHEN dim.year_period LIKE '%01'THEN to_number(CONCAT(to_char(dim.PERIOD_YEAR-1) , '01'   )) END AS ENDDATE 
  from dim_periods dim    WHERE dim.year_period=to_number(to_char(sysdate, 'YYYYMM')))

问题是 - 如何在 where 子句中使用子查询中的值和一行? 我需要得到这样的东西,我只是不明白我应该如何加入我的子查询和我使用的其他表 -

select * from financial_data fd 
where fd.year_period BETWEEN subq.start_date and subq.enddate

【问题讨论】:

    标签: sql oracle subquery


    【解决方案1】:

    您可以将子查询,即CTE与表连接起来,然后在过滤谓词中使用列名。 WITH 子句 中子查询的结果就像一个临时表。

    例如,

    WITH SUBQ AS
      (SELECT dim.MONTH_NAME AS current_month_name ,
        dim.year_period      AS current_month ,
        dim.PERIOD_YEAR      AS YEAR ,
        CASE
          WHEN dim.year_period NOT LIKE '%01'
          THEN to_number(CONCAT(TO_CHAR(dim.PERIOD_YEAR-1) , '01' ))
          WHEN dim.year_period LIKE '%01'
          THEN to_number(CONCAT(TO_CHAR(dim.PERIOD_YEAR-2) , '01' ))
        END AS START_DATE ,
        CASE
          WHEN dim.year_period NOT LIKE '%01'
          THEN to_number(CONCAT(TO_CHAR(dim.PERIOD_YEAR) , '01' ))
          WHEN dim.year_period LIKE '%01'
          THEN to_number(CONCAT(TO_CHAR(dim.PERIOD_YEAR-1) , '01' ))
        END AS ENDDATE
      FROM dim_periods dim
      WHERE dim.year_period=to_number(TO_CHAR(SYSDATE, 'YYYYMM'))
      )
    SELECT fd.COLUMNS,
      q.COLUMNS
    FROM financial_data fd
    JOIN subq q
    ON (fd.KEY = q.KEY) -- join key
    WHERE fd.year_period BETWEEN q.start_date AND q.enddate;
    

    因此,SUBQ 就像一个临时表,您可以将其与financial_data 表连接。

    UPDATE OP 不需要 ANSI 连接语法。

    WITH SUBQ AS
      (SELECT dim.MONTH_NAME AS current_month_name ,
        dim.year_period      AS current_month ,
        dim.PERIOD_YEAR      AS YEAR ,
        CASE
          WHEN dim.year_period NOT LIKE '%01'
          THEN to_number(CONCAT(TO_CHAR(dim.PERIOD_YEAR-1) , '01' ))
          WHEN dim.year_period LIKE '%01'
          THEN to_number(CONCAT(TO_CHAR(dim.PERIOD_YEAR-2) , '01' ))
        END AS START_DATE ,
        CASE
          WHEN dim.year_period NOT LIKE '%01'
          THEN to_number(CONCAT(TO_CHAR(dim.PERIOD_YEAR) , '01' ))
          WHEN dim.year_period LIKE '%01'
          THEN to_number(CONCAT(TO_CHAR(dim.PERIOD_YEAR-1) , '01' ))
        END AS ENDDATE
      FROM dim_periods dim
      WHERE dim.year_period=to_number(TO_CHAR(SYSDATE, 'YYYYMM'))
      )
    SELECT fd.COLUMNS,
      q.COLUMNS
    FROM financial_data fd,
      subq q
    WHERE fd.KEY = q.KEY -- join key
    AND fd.year_period BETWEEN q.start_date AND q.enddate;
    

    【讨论】:

    • 好的,但是我如何使用 WHERE 子句中的连接来做到这一点?因为如果我尝试执行以下操作: fd.year_period=subq2.current_month AND fd.year_period 在 subq2.start_date 和 subq2.enddate 之间我没有得到任何返回行,我根本不明白为什么
    • @user3014914 我为您提供了 ANSI 语法。请参阅我对 Oracle 等效语法的更新。
    猜你喜欢
    • 2015-05-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多