-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の2つの部分で2回実行したいと思います。同じコードを貼り付けずにそれを行うにはどうすればよいですか。また..上記のコードをどのように書き直すことができますか?。パフォーマンスに問題があります。

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 に答える