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;
我需要根据 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;