2012-11-01 58 views
-1

这是一个摘录的SQL得到天oracle select语句重用?

AND S.Date   IN 

    (
    SELECT Date 
    FROM 
     (
     SELECT Date, 
     ROW_NUMBER() OVER (ORDER BY Date DESC)-1 Day 
     FROM CALENDAR_DIM 
     WHERE TYPE    = 'ABC' 
    ) 
    WHERE BUS_DAY BETWEEN 0 AND 2 
) 

我想在我的SQL两个部分两次运行此代码。我怎么能不粘贴相同的代码。另外..我怎么可以重写上面的代码?我有一些性能问题。

+0

为什么MySQL的标签? –

+0

认为你有一个错字:不应该是'ROW_NUMBER()OVER(ORDER BY日期DESC)-1 BUS_DAY',或者我不知道你的BUS_DAY来自哪里...... –

回答

3

解决方案1 ​​:使用WITH语句

WITH dateQuery AS (
    SELECT Date 
    FROM 
     (
     SELECT Date, 
     ROW_NUMBER() OVER (ORDER BY Date DESC)-1 BUS_DAY 
     FROM CALENDAR_DIM 
     WHERE TYPE = 'ABC' 
    ) 
    WHERE BUS_DAY BETWEEN 0 AND 2) 



SELECT xxx 
FROM yyy 
WHERE zzz 
AND s.Date IN (SELECT Date FROM dateQuery) 

唯一重复的部分是

SELECT Date FROM dateQuery 

解决方案2:创建一个视图

CREATE OR REPLACE VIEW V_DATE_QUERY AS 
( SELECT Date 
    FROM 
     (
     SELECT Date, 
     ROW_NUMBER() OVER (ORDER BY Date DESC)-1 BUS_DAY 
     FROM CALENDAR_DIM 
     WHERE TYPE = 'ABC' 
    ) 
    WHERE BUS_DAY BETWEEN 0 AND 2) 

,并用同样的方式

AND s.Date IN (Select Date FROM V_DATE_QUERY); 
+0

@ user648244,因为它是一个“物化“子查询(Oracle将其转换为内联视图或临时表),而不仅仅是子查询。 http://www.dba-oracle.com/t_with_clause.htm –

+0

是的,我发现谢谢你 – user648244

1

你会做这样的view在数据库中,像这样:

CREATE VIEW view_date 
AS 
SELECT Date, 
    ROW_NUMBER() OVER (ORDER BY Date DESC)-1 Day 
FROM CALENDAR_DIM 
WHERE TYPE    = 'ABC' 

现在你可以使用:

AND S.Date   IN 

    (
    SELECT Date 
    FROM view_date 
    WHERE BUS_DAY BETWEEN 0 AND 2 
)