2010-11-22 17 views
1

次のクエリを使用して、異なる列選択で選択サブクエリを繰り返すので、より洗練された方法で書くことができます。最初の選択クエリはコード内で2回繰り返されますが、列の選択が異なります。繰り返しサブクエリをJOINSに変換する

SET @date1 = '2010-01-06'; 
SET @date2 = '2010-07-01'; 
SET @qdate = '2010-07-01'; 
SET @period = 'WEEK'; 
     (SELECT S.date1, 
       S.date2, 
       S.period, 
       Q.market, 
       Q.ticker, 
       Q.close * EXP(S.ratio) AS scenario 

     FROM portfolio.scenario S , portfolio.quote Q 

     WHERE 
       S.date1 >= @date1 AND 
       S.date2 <= @date2 AND 
       Q.date = @qdate AND 
       S.series = @series AND 
       Q.market = S.market AND 
       Q.ticker = S.ticker) 

UNION 

     (SELECT T2.date1, 
       T2.date2, 
       T2.period, 
       T1.market, 
       T1.ticker, 
       0 AS scenario 
     FROM 
        (SELECT DISTINCT 
          Q.market, 
          Q.ticker 

        FROM portfolio.scenario S , portfolio.quote Q 

        WHERE 
         S.date1 >= @date1 AND 
         S.date2 <= @date2 AND 
         Q.date = @qdate AND 
         S.series = @series AND 
         Q.market = S.market AND 
         Q.ticker = S.ticker) AS T1 

      JOIN 

        (SELECT DISTINCT S.date1, S.date2, S.period 
        FROM portfolio.scenario S 
        WHERE S.series = @series AND 
         S.date1 >= @date1 AND 
         S.date2 <= @date2) AS T2 

      WHERE  (T2.date1, 
         T2.date2, 
         T2.period, 
         T1.market, 
         T1.ticker) 

        NOT IN 

         (SELECT S.date1, 
         S.date2, 
         S.period, 
         Q.market, 
         Q.ticker 

         FROM portfolio.scenario S , portfolio.quote Q 

         WHERE 
           S.date1 >= @date1 AND 
           S.date2 <= @date2 AND 
           Q.date = @qdate AND 
           S.series = @series AND 
           Q.market = S.market AND 
           Q.ticker = S.ticker)) 
+0

テーブルスペックを持っていればもっと喜んでもらえます。CREATEステートメントやサンプルデータのようなものでしょうか? – zanlok

答えて

0

私はここにあなたの全体のクエリを繰り返すように怠惰にしていますが、結果のフィールドを交換する簡単な方法があるがCaseステートメントを使用することです。

これにより、変数に基づいて異なるフィールドを出力することができます。

よう

CASE input_expression WHEN when_expression THEN result_expression [ ...n ] [ ELSE else_result_expression ] END

は、select句内で使用することができます。 Zhisでは、クエリの3番目のフィールドに基づいてフィールドを切り替えることができます。

関連する問題