我有两个表,“分裂”和“股息”来描述股票市场中的事件。
拆分表有“天”,“比率”和“自动收报机”。 股息表有“天”,“金额”和“股票代码”。
我想得到一个结果连接表,其中包含两个表的信息,按日期和自动收报机排序。所以像这样:(抱歉格式化)
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
答案 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