Оператор соединения в SQL - PullRequest
0 голосов
/ 15 июня 2009

У меня есть две таблицы: «расщепление» и «дивиденды», которые описывают события на фондовом рынке.

Таблица разбивки имеет «день», «коэффициент» и «тикер». В таблице дивидендов есть «день», «сумма» и «тикер».

Я хотел бы получить результирующую объединенную таблицу, которая содержит информацию обеих таблиц И отсортирована по дате и тикеру. Так что-то вроде этого: (извините за форматирование)

splits.day splits.ratio splits.ticker dividends.day dividends.amount dividends.ticker

1990-01-03      2            QQQQ          null           null            null

null          null            null        1995-05-05      15.55          SPY

2000-09-15     3             DIA           null            null           null

null            null           null        2005-03-15     3             DIA

Я просмотрел полные внешние объединения в Википедии (используя союзы на MySQL), но не мог понять, как отсортировать их по дням ... Любая помощь будет принята с благодарностью!

РЕДАКТИРОВАТЬ: вот пример того, что расщепления и дивиденды содержат в приведенном выше примере

splits.day splits.ratio splits.ticker

1990-01-03      2            QQQQ

2000-09-15     3             DIA



dividends.day dividends.amount dividends.ticker

1995-05-05      15.55          SPY

2005-03-15     3.55             QQQQ

Ответы [ 5 ]

1 голос
/ 15 июня 2009

ОК, исходя из ваших правок, мне кажется, что вы вообще не хотите присоединяться. Вы, вероятно, хотите сделать это:

select *
from 
(
    select day, ticker, ratio, null as amount
    from splits

    union

    select day, ticker, null as ratio, amount
    from dividends
) as q
order by day, ticker
0 голосов
/ 15 июня 2009

Вы не должны использовать союзы. Вы должны быть в состоянии сделать это (извините, у меня нет MySQL для тестирования):

select 
    ifnull(splits.day, dividends.day) as day, splits.ratio, 
    ifnull(splits.ticker, dividends.ticker) as ticker, dividends.amount
from splits 
    outer join dividends on 
        splits.day = dividends.day and splits.ticker = dividends.ticker
order by day, ticker
0 голосов
/ 15 июня 2009

Я не понимаю, зачем вам нуля, которые вы используете в своем примере, означает ли это, что не каждая строка в одной таблице имеет каждый "тикер" на другой? Является ли даже «тикером» связь между двумя таблицами?

Если все вышеизложенные предположения верны, то что-то вроде этого должно быть тем, что вы хотите:

select splits.*, dividends.* from splits left join dividends 
on (splits.ticker = dividends.ticker) 
order by splits.day, dividends.day, splits.ticker

РЕДАКТИРОВАТЬ: Основываясь на комментариях, вы можете искать союз

select a.ticker,a.ratio_or_amount,a.day,a.what from (
select ticker, day, ratio as ratio_or_amount, 'splits' as what from splits
union 
select ticker, day, amount as ratio_or_amount, 'dividends' as what from dividends
) a order by a.day

Это безобразно, но я действительно не могу понять, что вы ищете. Похоже, вы пропустили переподготовку по теории отношений .

0 голосов
/ 15 июня 2009

Возможно, вы захотите взглянуть на GREATEST() (http://dev.mysql.com/doc/refman/5.0/en/comparison-operators.html#function_greatest), чтобы создать сопоставимую строку даты. Однако не думайте, что значения NULL могут быть проблемой в MySQL> = 5.0.13.

0 голосов
/ 15 июня 2009

сделать полное внешнее присоединение:

select splits.day splits.ratio splits.ticker dividends.day dividends.amount dividends.ticker from splits , dividends where splits.ticker = dividends.ticker order by splits.day
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...