【问题标题】:oracle select statement reuse?oracle select语句重用?
【发布时间】:2012-10-21 21:02:08
【问题描述】:

这是获取天数的提取 sql

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 的两个部分中运行此代码两次。如果不粘贴相同的代码,我怎么能做到这一点。另外..我怎么能重写上面的代码?我在性能方面遇到了一些问题。

【问题讨论】:

  • 认为你打错字了:不应该是ROW_NUMBER() OVER (ORDER BY Date DESC )-1 BUS_DAY,否则我不知道你的BUS_DAY来自哪里...

标签: mysql database oracle select


【解决方案1】:

解决方案 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);

【讨论】:

  • @user648244 因为它是“物化”子查询(Oracle 将其转换为内联视图或临时表。),而不仅仅是子查询。 dba-oracle.com/t_with_clause.htm
【解决方案2】:

您可以像这样在数据库中将其设为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
  )

【讨论】:

    猜你喜欢
    • 2013-09-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-07
    • 2011-08-27
    • 2011-11-11
    • 2012-11-19
    相关资源
    最近更新 更多