【问题标题】:OleDb Select Command Returning an Empty ColumnOleDb 选择命令返回一个空列
【发布时间】:2013-11-09 00:15:02
【问题描述】:

我的数据库中有两个已保存的查询,名为 Free_Cash_FlowQuarterly_Growth_Rates。它们显示在这里:

Free_Cash_Flow:

Quarterly_Growth_Rates:

当我使用这段代码时:

SELECT * _
FROM Free_Cash_Flow 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)

这是返回的:

Free_Cash_Flow 列为空白。但正如您在Free_Cash_Flow 表中看到的那样,该列中有数据。为什么没有被拉入新表?我用其他类似格式的表运行这个查询,一切都很好。有什么建议吗?

其他信息

我想补充一点,Free_Cash_Flow 列是使用其各自已保存查询的 SQL 语句中的公式填充的。我认为这可能与我的问题有关。我真的被困在这里,我迫切需要弄清楚这一点。

下面是包含用于 Free_Cash_Flow 保存查询的 SQL 语句的代码:

变量:

Dim Calculation = “Free_Cash_Flow”

Dim Formula = “(SELECT (SUM(su.Net_Cash_Flow_Operating) - SUM(su.Capital_Expenditures)) _
FROM (SELECT Ticker, [Year], Period, Net_Cash_Flow_Operating, Capital_Expenditures _
FROM Cash_Flow_Statements UNION ALL SELECT Ticker, [Year] + 1, Period - 4, Net_Cash_Flow_Operating, Capital_Expenditures _
FROM Cash_Flow_Statements) su _
WHERE su.Ticker = c.Ticker AND su.[Year] = c.[Year] AND (su.Period Between c.Period - 3 And c.Period))”

Dim Where_Statement = "WHERE i.Period < 5"

SQL 语句:

"CREATE PROC " & Calculation & " AS SELECT i.Ticker, i.[Year], i.Period, " & Formula & " AS " & Calculation & " _
FROM (Income_Statements AS i _
INNER JOIN Balance_Sheets AS b _
ON (i.Ticker = b.Ticker) AND (i.[Year] = b.[Year]) AND (i.Period = b.Period)) _
INNER JOIN Cash_Flow_Statements AS c ON (b.Ticker = c.Ticker) AND (b.[Year] = c.[Year]) AND (b.Period = c.Period) " & Where_Statement & ""

【问题讨论】:

  • 关键可能在您用于Free_Cash_Flow 保存查询的SQL 语句中。你能把它包括在你的问题中吗?
  • @Twinkles 我已将包含用于 Free_Cash_Flow 保存查询的 SQL 语句的代码添加到我的原始帖子中。我也认为这是解决我问题的关键。有什么想法吗?

标签: sql database vb.net oledb selectcommand


【解决方案1】:

不知道具体原因,但通常不首选使用“*”,但如果您明确查询命名列,您可能会得到更好/正确的答案,例如

select 
      C.Ticker,
      C.Year,
      C.Period,
      C.Free_Cash_Flow,
      G.Year as GrowthYear,
      G.Period as GrowthPeriod 
   from ....

它可能会感到困惑,因为表名与列相同并忽略它。通过分别使用“C”和“G”别名限定列,可能会满足您的需求。

【讨论】:

  • 我尝试了您的建议,但得到了相同的结果。我还应该提到Free_Cash_FlowQuarterly_Growth_Rates 不是表,它们是已保存的查询,并且Free_Cash_Flow 列是使用其各自已保存查询的SQL 语句中的公式填充的。我认为这可能与我的问题有关。
  • 我在这个问题上悬赏。能再帮我解决这个问题吗?
【解决方案2】:

这可能与您的 JOIN 无关。我想知道Free_Cash_Flow 是否属于OLEDB 无法理解的类型。看起来它在 Open Office 中是作为货币价值的,对吧?您是否知道 OLEDB 完全可以看到该值?尝试一个更简单的查询,例如

SELECT C.Free_Cash_Flow FROM Free_Cash_Flow AS C

看看有没有什么结果。

【讨论】:

  • 返回包含正确数据的列!我只是使用 OpenOffice 来查看数据库。一切都是通过我的程序作为 Access 文件创建的。对我的下一步应该做什么有什么想法吗?
  • 我会一次添加一点复杂性,例如:SELECT * FROM Free_Cash_Flow AS C INNER JOIN Quarterly_Growth_Rates AS G ON C.Ticker = G.Ticker您对 Free_Cash_Flow 列的期望。
  • 如果我取出 JOIN 并运行 SELECT * FROM Free_Cash_Flow AS C Quarterly_Growth_Rates AS G Free_Cash_Flow 列返回数据。一旦我尝试使用任何东西加入,我就会遇到Free_Cash_Flow 列空白的相同问题。
  • 我在这个问题上悬赏。能再帮我解决这个问题吗?
【解决方案3】:

理论上,它没有理由不工作,除非列名与表名相同。也许您的数据库引擎对此感到困惑,请尝试重命名。

【讨论】:

  • 我已经尝试重命名它,但这并不能解决我的问题。此外,我还通过类似的命名结构运行了其他查询,这些都没有问题。我喜欢您关于密钥可能在我用于 Free_Cash_Flow 保存查询的 SQL 语句中的建议。我会将该代码加载到我的原始帖子中。
  • 另一个可能的命名冲突:表别名 C 被使用了两次:在存储的查询和连接中。
  • 这可能会有所帮助。如果我用另一个保存的查询替换 Free_Cash_Flow 一切正常。例如,我有一个名为 Current_Ratio 的已保存查询,当我运行此代码 SELECT * FROM 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) 时,我会在所有列中获取数据,包括一个名为 Current_Ratio 的列。
  • 这让我觉得问题出在我的 Free_Cash_Flow 保存的查询上。
  • 我切换了可能的命名冲突,因此表别名 C 没有被使用两次,我收到了同样的错误。
【解决方案4】:

重命名时需要指定需要的列,如下面的C&G:

SELECT C.*, G.* _
FROM Free_Cash_Flow 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)

【讨论】:

    【解决方案5】:

    您是否尝试过将最后一部分更改为 WHERE 并查看返回的内容?

    WHERE ((IIF(C.Period = 4, C.Year + 1, C.Year)) = G.Year) AND
          ((IIF(C.Period = 4, 1, C.Period + 1)) = G.Qtr)
    

    【讨论】:

    • 它仍然返回空白列。
    • 您是否检查过“年份”是否是受保护的字词? - 可能将数据库列名更改为“TheYear”或其他名称。
    【解决方案6】:

    尝试像下面这样替换表名并检查 Quarterly_Growth_Rates 列是否出现,如果该列也没有出现,那么可能是名称相同的问题。

    SELECT * _
    FROM Quarterly_Growth_Rates AS G _ INNER JOIN Free_Cash_Flow AS C _ON (G.Ticker = C.Ticker) AND (G.Year = (IIF(C.Period = 4, C.Year + 1, C.Year))) AND (G.Qtr = (IIF(C.Period = 4, 1, C.Period + 1)))
    

    【讨论】:

    • 我进行了您建议的更改,但 Free_Cash_Flow 列仍为空白。 Quarterly_Growth_Rates 列确实包含数据,所以我不认为这是一个名称相同的问题。
    • @gromit1 做一件事将查询数据存储在不同的临时表中,然后进行内部连接,我相信您一定会得到 Free_Cash_Flow 列数据。
    • 你是什么意思将查询数据存储在不同的临时表中,然后进行内部连接?我该怎么做呢?
    猜你喜欢
    • 2019-11-29
    • 2018-03-06
    • 1970-01-01
    • 2018-04-22
    • 1970-01-01
    • 2020-07-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多