WHERE 子句中的条件 (Oracle)

Condition in WHERE clause (Oracle)

我需要根据 month/year 的内容查询 returns 数据。下面是我写的一个子查询,其中 returns 一行 - 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

您可以加​​入 子查询 ,即 CTE 与 table,然后在过滤谓词WITH 子句 中子查询的结果类似于 临时 table.

例如,

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 就像一个临时的 table,您可以加入 financial_data table。

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;