[英]Condition in WHERE clause (Oracle)
我需要一个查询,该查询返回基于其年/月的数据。 以下是我编写的子查询,该查询返回一行-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)与表联接 ,然后在过滤谓词中使用列名。 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
表SUBQ
。
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.