gpt4 book ai didi

sql - 复杂(?)SQL 连接查询

转载 作者:行者123 更新时间:2023-12-04 22:12:05 27 4
gpt4 key购买 nike

我有 2 个表:

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

2) Stockdata 表,其中包含表单中的股票数据 日期、交易品种、开盘价、最高价、最低价、收盘价、交易量(主键 = 日期、交易品种)

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

MDate,SDate,Symbol,Open,High,...

6/4/2001,6/4/2001,Foo,47,49,...

6/5/2001,null,null,null,null,...

6/6/2001,6/6/2001,Foo,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')

如果这执行得不够快,那么您可以通过在一个查询中为最小值和最大值设置变量然后在主查询中使用它们来提高性能。这至少可以为您节省一次索引命中。

所以(在 ​​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

您还需要确保在 masterdate.date 上有一个索引,在 stockdata(date, symbol) 上有一个复合索引。

关于sql - 复杂(?)SQL 连接查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/992929/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com