我有两个Microsoft Access数据库表。它们的名称为Historical_Stock_Prices
和Balance_Sheets
。我需要组合每个表中的数据来创建一个名为Daily
的表。我需要从Ticker
获取字段[Date]
,[Close]
和Historical_Stock_Prices
,我需要从Common_Stocks
获取字段Balance_Sheets
。< / p>
我不会从Historical_Stock_Prices
和Balance_Sheets
获取每一行。我只会在名为DateTimePicker
的{{1}}中选择日期之前或之前的行。
现在我遇到的主要问题是dtpDateSelection
每天都包含一行。虽然Historical_Stock_Prices
每季度包含一行。因此,对于四分之一的每一天,来自Balance_Sheets
的数字Common_Stocks
数字将是相同的。
我该怎么做?
这是我到目前为止的代码:
Balance_Sheet
这显然不包含表Dim Date1 As Date = dtpDateSelection.Value
Dim cmd As OleDbCommand = New OleDbCommand("CREATE PROC Daily AS SELECT Ticker, [Date], [Close] From Historical_Stock_Prices WHERE [Date] = " & Date1 & "", con)
cmd.ExecuteNonQuery()
。另外,目前我的where语句会抛出错误。
附加信息:表格架构
答案 0 :(得分:2)
Historical_Stock_Prices和Balance_Sheets共有的季度内部联接。也就是说,每个日期都在四分之一。如果Balance_Sheets有一个名为Period的字段,即1,2,3或4,对应于一年中的每个季度,并且您有一个4字节数字的Year字段,那么此选择查询应该可以工作并且可以轻松转换进入make table查询。
select Ticker, Date, Close, Common_Stocks
from Historical_Stock_Prices, Balance_Sheets
where Format(Historical_Stock_Prices.Date, "q") = Balance_Sheets.Period
and Year(Historical_Stock_Prices.Date) = Balance_Sheets.Year
答案 1 :(得分:2)
创建一个包含2个新字段Quarter和Year的Historical_Stock_Prices查询,并使用相应的函数从行的日期中提取这些值。然后使用这些字段连接两个表。你在VB中的最终陈述应该违背该查询。
至于为什么在SQL语句中出现错误,你没有#around参数。
Dim cmd As OleDbCommand = New OleDbCommand("CREATE PROC Daily AS SELECT Ticker, [Date], [Close] From Historical_Stock_Prices WHERE [Date] = #" & Date1 & "#", con)
请注意,这仍然是糟糕的形式,只是在等待SQL注入攻击。要查找如何使用参数化查询。
答案 2 :(得分:2)
"SELECT [H].[Ticker], [H].[Date], [H].[Close], [B].[Common_Stocks]
FROM [Historical_Stock_Prices] AS [H], [Balance_Sheets] AS [B]
WHERE [H].[Ticker] = [B].[Ticker]
AND Int(Format([H].[Date],'Q')) = Int([B].[Period])
AND Int(Year([H].[Date])) = Int([B].[Year])
AND [H].[Date] <= #" & Date1.value & "#"