【问题标题】:MS Access SQL Select Statement from Two TablesMS Access SQL 从两个表中选择语句
【发布时间】:2013-10-09 07:51:16
【问题描述】:

我有两个 Microsoft Access 数据库表。它们被命名为Historical_Stock_PricesBalance_Sheets。我需要组合这些表中的每一个表中的数据来创建一个名为Daily 的表。我需要从Historical_Stock_Prices 获取字段Ticker[Date][Close],并且我需要从Balance_Sheets 获取字段Common_Stocks

不过,我不会从Historical_Stock_PricesBalance_Sheets 中获取每一行。我只会获取在名为dtpDateSelectionDateTimePicker 中选择的日期之前或之前的行。

现在我遇到的主要问题是Historical_Stock_Prices 每天都包含一行。而Balance_Sheets 包含每个季度的一行。因此,对于一个季度中的每一天,来自 Balance_Sheet 的数字 Common_Stocks 将是相同的。

我该怎么做?

这是我目前的代码:

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()

这显然根本不包含表Balance_Sheet。另外,目前我的 where 语句正在引发错误。

其他信息:表架构

【问题讨论】:

  • Historical_Stock_Prices 和 Balance_Sheets 如何联系在一起?他们有主键/外键吗?如果他们没有主键/外键,那么我猜他们是通过季度和年份字段链接的。
  • @Linger 他们没有链接。我不确定链接它们的最佳方式是什么。 Historical_Stock_Prices 有两个字段的主键。他们是Ticker[Date]Balance_Sheets 具有三个字段的主键。它们是Ticker[Year]Period

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


【解决方案1】:

从包含 2 个新字段 Quarter 和 Year 的 Historical_Stock_Prices 中创建查询,并使用适当的函数从行日期中提取这些值。然后使用这些字段连接您的两个表。您在 VB 中的最终语句应该与该查询相反。

至于为什么你的SQL语句会出错,你的参数周围没有#。

Dim cmd As OleDbCommand = New OleDbCommand("CREATE PROC Daily AS SELECT Ticker, [Date], [Close] From Historical_Stock_Prices WHERE [Date] = #" & Date1 & "#", con)

请注意,这仍然是错误的形式,只是在等待 SQL 注入攻击。最好看看如何使用参数化查询。

【讨论】:

  • 感谢您的建议。我会努力的。我之前曾尝试使用参数化查询,但我也遇到了错误。这是我所拥有的:SELECT Ticker, [Date], [Close] From Historical_Stock_Prices WHERE [Date] = ?", con) cmd.Parameters.AddWithValue("?", Date1)
  • 通常最好使用类似cmd.Parameters.Add("@Date", OleDbType.Date).value = Date1的东西@
【解决方案2】:

Historical_Stock_Prices 和 Balance_Sheets 共有的季度的内部联接。也就是说,每个日期都在一个季度内。如果 Balance_Sheets 有一个名为 Period 的字段,它是数字 1、2、3 或 4,对应于一年中的每个季度,并且您有一个 Year 字段是一个 4 位数字,那么这个选择查询应该可以工作并且可以轻松转换进入生成表查询。

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

【讨论】:

  • 建议的代码返回此错误消息Additional information: Cannot find table or constraint.
  • 您在 Balance_Sheets 中是否有一个名为 Quarter 的字段或与之等效的字段?我看到您在上面提到了年份和期间字段。 Period 是否代表四分之一(例如,值为 1、2、3 或 4)?
  • 试试这个。当我在 Access 2010 中测试类似的东西时,它不喜欢内部连接中的 Format(...) 。所以我交叉连接了表(使用逗号而不是单词内部连接)并将 on 语句移动到 where 子句中。还要确保所有字段和表名都存在并且拼写正确,并且它们都没有空格。如果这不起作用,您需要发布两个表的架构供我们审核。
  • 您是否尝试过从 Access 数据库中运行选择查询?如果它不起作用,您能否在 Access 和 vb.net 中运行一个非常简单的查询(例如select * from Historical_Stock_Prices)?
  • 看起来 Access 无用地将 Year(Historical_Stock_Prices.[Date]) 转换为 [Year](Historical_Stock_Prices.[Date]),这导致它尝试引用 [Year] 字段而不是使用 Year(...) 方法。将[Year](Historical_Stock_Prices.[Date]) 替换为Format(Historical_Stock_Prices.[Date], "yyyy")
【解决方案3】:
"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 & "#"

【讨论】:

  • 去掉ON Year(H.Date) = B.YearAND Format(H.Date,'Q') = B.Period,把AND H.Ticker = B.Ticker改成ON H.Ticker = B.Ticker,试试看是不是同样的错误
  • @nordeen1,你确定你有一个名为 Historical_Stock_Prices 的表吗?还是“历史股价”?
  • 当 Access 找不到您使用的名称的表时,会出现此错误 Additional information: Cannot find table or constraint.。检查两个表名的拼写,其中没有空格(包括开头和结尾)
  • 您是按原样运行查询,还是使用它创建一个过程?尝试在不创建过程的情况下作为查询运行以查看它是否有效
  • 伙计,它应该可以正常工作。但是,我编辑了我的答案以尝试其他方法。如果它不起作用,请仔细检查每个字段和表名以确保它们正确。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-04
相关资源
最近更新 更多