-1

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

4

2 回答 2

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);
于 2012-11-01T09:45:43.310 回答
1

您可以像这样在数据库中创建一个视图:

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
  )
于 2012-11-01T09:40:20.937 回答