复杂(?)SQL连接查询

复杂(?)SQL连接查询,sql,Sql,我有两张桌子: 1) 表Masterdates,包含自1900年1月1日以来的所有日期 2) 表Stockdata,其中包含表单中的库存数据 日期、符号、打开、高、低、关闭、音量(主键=日期、符号) 这就是我要检索的内容(此处以CSV格式显示) MDate,SDate,符号,打开,高 2001年6月4日,2001年6月4日,福,47,49 2001年6月5日,零,零,零 2001年6月6日,2001年6月6日,福,54,56 其中MDate来自Masterdates,SDate来自Stockda

我有两张桌子:

1) 表Masterdates,包含自1900年1月1日以来的所有日期

2) 表Stockdata,其中包含表单中的库存数据 日期、符号、打开、高、低、关闭、音量(主键=日期、符号)

这就是我要检索的内容(此处以CSV格式显示)

MDate,SDate,符号,打开,高

2001年6月4日,2001年6月4日,福,47,49

2001年6月5日,零,零,零

2001年6月6日,2001年6月6日,福,54,56

其中MDate来自Masterdates,SDate来自Stockdata。我需要让输出从Stockdata中所需符号的第一个(最早的)扩展数据块日期开始(在本例中为Foo,从2001年6月4日开始),然后包括Masterdates中的所有日期,直到并包括Stockdata中所需符号的最后一个(最新)可用日期,输出空值,其中给定Masterdate记录在所述范围内没有对应的Stockdata记录

有没有一种方法可以在单个查询、一系列查询和/或通过添加辅助表来实现这一点,从而产生快速的结果?或者我必须转储所需的超集,然后使用我的(非SQL)编程语言构造最终输出


在SQLITE3中测试TIA时,您的DB实现可能会有所不同

SELECT   m.date, 
         s.symbol, 
         s.open, 
         s.high, 
         s.low, 
         s.close, 
         s.volume
FROM     masterdate AS m LEFT OUTER JOIN 
         stockdata AS s ON m.date = s.date
AND      s.symbol = 'Foo'
WHERE    m.date >= (SELECT MIN(date) FROM stockdata WHERE symbol = 'Foo')
AND      m.date <= (SELECT MAX(date) FROM stockdata WHERE symbol = 'Foo')

您还需要确保在masterdate.date上有索引,在stockdata(日期,符号)上有复合索引

如果使用SQLServer,则可以使用TSQL存储过程返回结果。它基本上有两条线:

1) 获取可用数据的第一个日期 2) 具有外部联接的查询


如果使用Oracle,则可以使用PL/SQL编写类似的(尽管稍微复杂一点)存储过程来计算所需的答案。

这是一个典型的左连接:

SELECT * FROM masterdates
    LEFT JOIN stockdata ON masterdates.date = stockdata.date;

显然,这应该改进为只返回所需的列。

我建议从Stockdata表中填写缺少的条目,并使用内部联接。应该快得多。

到底是哪种SQL系统?MS SQL Server?MySQL?但这会给我Masterdates中的一切,在6GB数据库上不需要22秒。比我想象的要快,但不是我需要的地方。我想,如果我把这些数据分解出来,我可以将其分解成更好的数据(目前我有每日、日内、股票、期货、指数,你可以随便说,数据都在一个表中)。非常感谢。你能再解释一下吗?
SELECT * FROM masterdates
    LEFT JOIN stockdata ON masterdates.date = stockdata.date;