преодоление условия «хотя бы один раз» в левом соединении - PullRequest
1 голос
/ 12 ноября 2010

У меня есть следующие две таблицы quote(date,market,ticker,close) и scenario(date1,date2,period,market,ticker,ratio).Я написал следующий запрос LEFT JOIN, который делает то, что я хочу, за исключением одной проблемы:

SELECT  S.date1 AS date1, 
        S.date2 AS date2,
        S.period AS period,
        Q.market AS market,
        Q.ticker AS ticker,
        Q.close * EXP(S.ratio) AS scenario

FROM portfolio.quote Q  LEFT JOIN  portfolio.scenario S 

      ON Q.market = S.market AND
         Q.ticker = S.ticker AND
         S.date1 >= '2010-06-01' AND
         S.date2 <= '2010-07-01' AND
         S.period = 'WEEK'

WHERE Q.date = '2010-07-01' 
ORDER BY S.date1, S.date2, S.period, Q.market, Q.ticker

Предыдущий запрос возвращает результаты и всякий раз, когда (рынок, тикер) в таблице котировок не совпадает с эквивалентным(market, ticker) в таблицу сценариев добавляется строка со значениями NULL для столбцов, принадлежащих таблице сценариев, следующим образом:

date1, date2, period, market , ticker, scenario
NULL , NULL , NULL  , 'sp500', 'QEP' , NULL

За период между '2010-06-01' и '2010-07-01 'с периодом' WEEK 'может быть много несопоставленных строк для (' sp500 ',' QEP '), но только одна строка представляет этот факт со значениями NULL в столбцах, принадлежащих таблице сценариев.Не говоря уже о том, что в этих результатах есть много несопоставленных строк для (market, ticker), но существует хотя бы одно совпадение, поэтому запрос не возвращает значения NULL для этих строк.

Что я хочу сделать, это дляНапример, если Q.date = '2010-07-01' возвращает 500 строк для таблицы котировок, тогда будет 500 * (DISTINCT date1, date, period).со значениями NULL в столбце сценария, только когда следующее условие не соответствует:

Q.market = S.market AND
Q.ticker = S.ticker

Так, например, результаты NULL будут выглядеть примерно так:

date1        , date2        , period  , market , ticker, scenario
'2010-06-01' , '2010-06-08' , 'WEEK'  , 'sp500', 'QEP' , NULL
'2010-06-08' , '2010-06-15' , 'WEEK'  , 'sp500', 'QEP' , NULL
'2010-06-15' , '2010-06-23' , 'WEEK'  , 'sp500', 'A'   , NULL

Другой пример, если, например,(market,ticker,close) строк, которые соответствуют Q.date = '2010-07-01' из таблицы кавычек:

('sp','A',1)
('sp','AA',2)

И (date1,date2,period,market,ticker,ratio) строк, которые соответствуют условиям

     S.date1 >= '2010-06-01' AND
     S.date2 <= '2010-07-01' AND
     S.period = 'WEEK'

:

('2010-06-01','2010-06-08','WEEK','sp','A',0.43)
('2010-06-01','2010-06-08','WEEK','sp','AA',0.21)

('2010-06-08','2010-06-20','WEEK','sp','A',0.49)

('2010-06-20','2010-06-27','WEEK','sp','A',0.46)
('2010-06-20','2010-06-27','WEEK','sp','B',0.23)

Тогда результат моего запроса должен вернуть

('2010-06-01','2010-06-08','WEEK','sp','A',1*EXP(0.43))
('2010-06-01','2010-06-08','WEEK','sp','AA',2*EXP(0.21))

('2010-06-08','2010-06-20','WEEK','sp','A',1*EXP(0.49))
('2010-06-08','2010-06-20','WEEK','sp','AA',NULL)

('2010-06-20','2010-06-27','WEEK','sp','A',1*EXP(0.46))
('2010-06-20','2010-06-27','WEEK','sp','AA',NULL)

Возможно ли такое в MySQL? Очень благодарен за любую помощь:)

1 Ответ

1 голос
/ 12 ноября 2010

Поскольку вы используете соединение влево, строки таблицы FROM (цитата) отображаются, даже если нет точного соответствия с другой таблицей (сценарием) для условий ON. Столбцы в другой таблице просто заменяются на NULL.

Однако, то, что вы хотели сделать, это отобразить все строки из таблицы сценариев, а не из таблицы кавычек. Поэтому я бы посоветовал вам использовать ПРАВИЛЬНОЕ объединение или заменить часть запроса на
FROM portfolio.scenario S LEFT JOIN portfolio.quote Q

Надеюсь, что решит вашу проблему.

...