我有两个表 - tblDividendData和tblStockPrice - 我一直在尝试构建一个查询来从tblDividendData中提取字段以及来自tblStockPrice的最新收盘价。我不是SQL大师,所以我有点担心,我在这里分享我的尝试,但我花了好几个小时,似乎在尝试一切,我无法让它返回正确的结果。我的查询如下:
SELECT tblDividendData.divOrganization,
tblDividendData.divExDividendDate,
(SELECT Close
FROM tblStockPrice s
WHERE Date = ( SELECT MAX(Date)
FROM tblStockPrice
WHERE s.Date <= tblDividendData.divExDividendDate
AND s.CompanyID=tblDividendData.divOrganization)) AS Close
FROM tblDividendData
这会返回收盘价字段的一些数据,但它不正确:只有当divExDividendDate大于所有tblStockPrice.Date时才会返回tblStockPrice.Close。
我真的很感激为什么我不能让这个工作得到帮助。我在这里使用Schema和查询设置了一个SQLFiddle:http://www.sqlfiddle.com/#!15/6ae82/2/0
查询在SQLFiddle上运行,但我注意到它将Access(我实际上将它放在一起)带到了膝盖。
答案 0 :(得分:1)
你很亲密。试试这个SQL:
SELECT tblDividendData.divOrganization,
tblDividendData.divExDividendDate,
(SELECT Close
FROM tblStockPrice s
WHERE Date = ( SELECT MAX(Date)
FROM tblStockPrice
WHERE Date <= tblDividendData.divExDividendDate
AND CompanyID=tblDividendData.divOrganization)
AND CompanyID=tblDividendData.divOrganization
) AS Close
FROM tblDividendData
有两个问题:
在您查找MAX(Date)
的子查询中,您在s.
子句中使用了WHERE
前缀。这是不正确的,因为它与外部查询中的表匹配。这可能是为什么它在Access中会很慢的原因。
找到CompanyID
后,您需要再次按MAX(Date)
进行过滤。