Преобразование повторных подзапросов в JOINS - PullRequest
1 голос
/ 22 ноября 2010

У меня есть следующий запрос, который повторяет подзапрос select с различными вариантами выбора столбцов, надеюсь, я мог бы написать его более элегантным способом. Обратите внимание, что первый запрос на выборку повторяется дважды в коде, но с другими вариантами выбора столбцов.

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))

1 Ответ

0 голосов
/ 22 ноября 2010

Мне лень повторять весь ваш запрос здесь, но есть простой способ заменить поля в результате с помощью оператора Case.

Это позволит вам выводить различные поля на основе переменной.

так

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

может использоваться внутри предложения select. Zhis позволит вам переключать поля на основе 3-го поля вашего запроса.

...