在SQL中加入Statement

时间:2009-06-15 06:09:01

标签: mysql sql join

我有两个表,“分裂”和“股息”来描述股票市场中的事件。

拆分表有“天”,“比率”和“自动收报机”。 股息表有“天”,“金额”和“股票代码”。

我想得到一个结果连接表,其中包含两个表的信息,按日期和自动收报机排序。所以像这样:(抱歉格式化)

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 个答案:

答案 0 :(得分:1)

好的,根据你的编辑,它看​​起来像你根本不想要一个连接。你可能想这样做:

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

答案 1 :(得分:0)

进行全面加入:

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

答案 2 :(得分:0)

我无法理解你为什么需要在你的例子中使用的空值,这是否意味着并非一个表中的每一行都有另一个“自动收报机”?甚至是“自动收报机”两个表之间的关系吗?

如果上述所有假设都是正确的,那么这样的事情应该是你想要的:

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

这很丑陋,但我真的失败了你所追求的。看起来你错过了relational theory的复习。

答案 3 :(得分:0)

您可能需要查看GREATEST()http://dev.mysql.com/doc/refman/5.0/en/comparison-operators.html#function_greatest)才能创建可比较的日期行。但是,不要NULL值可能是MySQL> = 5.0.13中的问题。

答案 4 :(得分:0)

你不应该使用工会。你应该能够做到这一点(对不起,我没有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