我有2张桌子:
1)表Masterdates,包含自1900年1月1日以来的所有日期
2)表格Stockdata,其中包含日期,符号,开放,高,低,收盘,交易量(主键=日期,符号)形式的股票数据
这是我想要检索的内容(以CSV格式显示)
MDate,SDATE,符号,开盘价,最高价,...
6月4日/ 2001,6/4/2001年,美孚,47,49,...
6/5/2001年,NULL,NULL,NULL,NULL,...
6/6/2001,6/6/2001年,美孚,54,56,...
其中MDate来自Masterdates,而SDate来自Stockdata.我需要让输出从Stockdata中所需符号的第一个(最早的)范围日期开始(在此示例中,Foo,从6/4/2001开始),然后包括Masterdates中的所有日期,包括最后一个日期(最新)Stockdata中所需符号的可用日期,输出空值,其中对于给定的Masterdate记录,在所描述的范围内没有相应的Stockdata记录.
有没有办法在单个查询,一系列查询和/或添加辅助表中执行此操作,这将产生快速结果?或者我是否必须转储我想要的超集,然后使用我的(非SQL)编程语言构造最终输出?
TIA
在SQLITE3中测试,您的数据库实现可能会有所不同
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')
Run Code Online (Sandbox Code Playgroud)
如果这不能足够快地执行,那么您可以通过在一个查询中设置最小值和最大值的变量然后在主查询中使用这些变量来提高性能.这样可以为您节省至少一个索引.
所以(在SQL Server语法中)
SET @symbol = 'Foo'
SELECT @mindate = MIN(date),
@maxdate = MAX(date)
FROM stockdata
WHERE stockdata.symbol = @symbol
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 = @symbol
WHERE m.date BETWEEN @mindate AND @maxdate
Run Code Online (Sandbox Code Playgroud)
您还需要确保在masterdate.date上有索引,在stockdata(日期,符号)上有一个复合索引.