MS Access SQL从两个表中选择语句

时间:2013-10-02 19:27:07

标签: sql vb.net ms-access access-vba select-query

我有两个Microsoft Access数据库表。它们的名称为Historical_Stock_PricesBalance_Sheets。我需要组合每个表中的数据来创建一个名为Daily的表。我需要从Ticker获取字段[Date][Close]Historical_Stock_Prices,我需要从Common_Stocks获取字段Balance_Sheets。< / p>

我不会从Historical_Stock_PricesBalance_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语句会抛出错误。

附加信息:表格架构

Balance_Sheet Schema

Historical_Stock_Prices Schema

3 个答案:

答案 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 & "#"