【问题标题】:Where to Put Variable Equations in SQL Statement?SQL 语句中变量方程放在哪里?
【发布时间】:2023-03-10 14:54:01
【问题描述】:

我正在使用 MS Access 运行一些计算。以下是给我带来麻烦的整体代码:

Dim cmd3 As OleDbCommand = New OleDbCommand("INSERT INTO Criteria (Calculation, [Interval], Tier_Juncture_1, Weight) _
SELECT ?, ?, (M * 0) + B _AS Tier_Juncture_1, _
((Avg(C." & Calculation & " * G.Growth) - Avg(C." & Calculation & ") * Avg(G.Growth)) / (StDevP(C." & Calculation & ") * StDevP(G.Growth)) * 10) AS Weight _
FROM (Sum(G.Growth) / Count(*)) - (1 * (Sum(C." & Calculation & ") / Count(*))) AS B, _
(Sum(C." & Calculation & " * G.Growth) - ((Sum(C." & Calculation & ") * Sum(G.Growth)) / Count(*))) / (Sum(C." & Calculation & " * C." & Calculation & ") - ((Sum(C." & Calculation & ") * Sum(C." & Calculation & ") / Count(*)))) AS M, _
" & Calculation & " AS C INNER JOIN " & Growth_Rate & " AS G _
" & On_Statement & "", con)
    cmd3.Parameters.AddWithValue("@Calculation", Calculation)
    cmd3.Parameters.AddWithValue("@[Interval]", Interval)
    cmd3.ExecuteNonQuery()

更具体地说,我的目标是将这个公式的结果插入到我名为Criteria 的表中Tier_Juncture_1 字段中:

(M * 0) + B _AS Tier_Juncture_1

如您所见,我在这个等式中有两个变量,MB。以下是每个公式:

(Sum(G.Growth) / Count(*)) - (1 * (Sum(C." & Calculation & ") / Count(*))) AS B

(Sum(C." & Calculation & " * G.Growth) - ((Sum(C." & Calculation & ") * Sum(G.Growth)) / Count(*))) / (Sum(C." & Calculation & " * C." & Calculation & ") - ((Sum(C." & Calculation & ") * Sum(C." & Calculation & ") / Count(*)))) AS M

我的问题是,在我的 SQL 语句中,我是否将我的两个变量的公式放在我原来的 Tier_Juncture_1 公式可以使用这些变量?正如您在上面看到的,我试图将它们放在我的 FROM 子句中,但我收到了这个错误:Syntax error in FROM clause.

变量本身的公式应该没有任何问题。我已经独立测试了它们,它们都返回正确的值而没有错误。我只需要知道将它们放在我的 SQL 语句中的什么位置。

更新

根据以下建议,我已从我的 SQL 语句中删除了参数。现在看起来像这样:

Dim cmd3 As OleDbCommand = New OleDbCommand("INSERT INTO Criteria (Calculation, [Interval], Tier_Juncture_1, Weight) _
SELECT " & Calculation & ", " & Interval & ", (M * 0) + B AS Tier_Juncture_1, _
((Avg(C." & Calculation & " * G.Growth) - Avg(C." & Calculation & ") * Avg(G.Growth)) / (StDevP(C." & Calculation & ") * StDevP(G.Growth)) * 10) AS Weight _
FROM (Sum(G.Growth) / Count(*)) - (1 * (Sum(C." & Calculation & ") / Count(*))) AS B, _
(Sum(C." & Calculation & " * G.Growth) - ((Sum(C." & Calculation & ") * Sum(G.Growth)) / Count(*))) / (Sum(C." & Calculation & " * C." & Calculation & ") - ((Sum(C." & Calculation & ") * Sum(C." & Calculation & ") / Count(*)))) AS M, _
" & Calculation & " AS C INNER JOIN " & Growth_Rate & " AS G _
" & On_Statement & "", con)
    cmd3.ExecuteNonQuery()

但是当我运行它时,我收到以下错误:Syntax error in FROM Clause.

我相信我收到了这个错误,因为我从原始帖子中插入了变量 MB 的方程式。所以我的问题仍然存在。在我的 SQL 语句中,我应该将这些等式放在哪里。

第二次更新

这是Debug.Writeline(cmd3.CommandText)返回的SQL语句:

INSERT INTO Criteria (Calculation, [Interval], Tier_Juncture_1, Weight) SELECT Current_Ratio, MRQ, (M * 0) + B AS Tier_Juncture_1, ((Avg(C.Current_Ratio * G.Growth) - Avg(C.Current_Ratio) * Avg(G.Growth)) / (StDevP(C.Current_Ratio) * StDevP(G.Growth)) * 10) AS Weight FROM (Sum(G.Growth) / Count(*)) - (1 * (Sum(C.Current_Ratio) / Count(*))) AS B, (Sum(C.Current_Ratio * G.Growth) - ((Sum(C.Current_Ratio) * Sum(G.Growth)) / Count(*))) / (Sum(C.Current_Ratio * C.Current_Ratio) - ((Sum(C.Current_Ratio) * Sum(C.Current_Ratio) / Count(*)))) AS M, Current_Ratio AS C INNER JOIN Quarterly_Growth_Rates AS G ON (C.Ticker = G.Ticker) AND ((IIF(C.Period = 4, C.Year + 1, C.Year)) = G.Year) AND ((IIF(C.Period = 4, 1, C.Period + 1)) = G.Qtr)

【问题讨论】:

  • 您的查询 CommandText 正在尝试使用 SELECT ?, ?, ... FROM ... 并且参数化查询无法做到这一点。参数只能用于指定列 values,而不是列 names 或任意 SQL 文本。这可能是您确实需要将 SQL CommandText“粘合在一起”而不是使用参数替换的情况之一。
  • @GordThompson 如何正确“粘合”我的 SQL?
  • @GordThompson 根据您的建议,我已取出参数。新代码列在我的原始帖子中。我现在收到此错误Syntax error in FROM clause。我相信我收到了这个错误,因为我从我的原始帖子中插入了变量 MB 的方程。所以我的问题仍然存在。在我的 SQL 语句中,我应该将这些等式放在哪里。

标签: sql vb.net ms-access oledb


【解决方案1】:

为了在您的 SQL(即Avg(G.Growth))中返回非聚合字段和聚合函数,您必须提供 GROUP BY

通过查看您的代码,我知道 Calculation 不是聚合,因为您对字段和表名使用相同的变量。

如果您需要进一步的帮助,您需要提供生成的 SQL 以供检查,我们不知道您的变量中有什么。即,Debug.Writeline(cmd3.CommandText)

【讨论】:

  • 我已经编辑了我的原始帖子。我之前发布了错误的代码。这是正确的代码,我收到此错误Syntax Error in FROM Clause. 我相信我收到此错误是因为我从原始帖子中插入了变量MB 的方程式。所以我的问题仍然存在。在我的 SQL 语句中,我应该将这些等式放在哪里。
  • 我还添加了来自Debug.Writeline(cmd3.CommandText)的完整SQL
  • 你的from 子句都搞砸了。你有[Some Calculation] AS B, [Some Calculation] AS M, [Some Calculation] AS C INNER JOIN ... 你想在这里做什么?这不是正确的 SQL。
  • 我需要来自 [Some Calculation] AS B[Some Calculation] AS M 的值来计算需要插入到我的表中的 (M * 0) + B AS Tier_Juncture_1
  • 我建议您在 Access Query 中使用它,然后在 VB 中替换您需要的部分。这是最好的学习方式。 FROM 中的所有内容都必须采用表格格式。我认为 Access 允许嵌套表,因此您应该能够执行以下操作:(SELECT [Some Calculation] AS B, [Some Calculation] AS M, [Some Calculation] AS C) as TmpTable INNER JOIN ...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-22
  • 1970-01-01
  • 1970-01-01
  • 2017-01-21
相关资源
最近更新 更多