简体   繁体   English

WHERE子句中的条件(Oracle)

[英]Condition in WHERE clause (Oracle)

I need a query which returns data based on what month/year it is. 我需要一个查询,该查询返回基于其年/月的数据。 Below is a subquery i wrote which returns one row - start_date and end_date are the values i need to use in my main query 以下是我编写的子查询,该查询返回一行-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')))

Question is - how do i use values from subquery with one row in where clauses? 问题是-我该如何在where子句中使用带有一行的子查询的值? I need to get something like this, i just dont understand how should i join my subquery and the rest of the tables i use - 我需要得到这样的东西,我只是不明白我应该如何加入我的子查询以及我使用的其余表-

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

You could join the subquery , ie the CTE with the table, and then use the column name in the filter predicate . 您可以将子查询 (即CTE)与表联接 ,然后在过滤谓词中使用列名。 The result of the subquery in the WITH clause acts like a temporary table . WITH子句中子查询的结果就像一个临时表

For example, 例如,

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;

So, SUBQ acts like a temporary table, which you join with financial_data table. 因此, SUBQ就像一个临时表,您可以将其与financial_dataSUBQ

UPDATE OP doesn't want the ANSI join syntax . 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;

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM