OleDb选择命令返回空列

时间:2013-10-29 17:20:47

标签: sql database vb.net oledb selectcommand

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

Free_Cash_Flowenter image description here

Quarterly_Growth_Ratesenter image description here

当我使用此代码时:

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)

返回: enter image description here

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 & ""

6 个答案:

答案 0 :(得分:1)

不要特别知道原因,但使用“*”通常不是首选,但如果您明确查询指定的列,则可能有更好/正确的答案,例如

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

可能会感到困惑,因为表名与列相同并忽略它。通过分别用“C”和“G”别名限定列,可能会做你想要的。

答案 1 :(得分:1)

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

SELECT C.Free_Cash_Flow FROM Free_Cash_Flow AS C

并查看是否会出现任何问题。

答案 2 :(得分:1)

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

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

答案 3 :(得分:1)

您需要指定重命名时所需的列,如C&amp; 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)

答案 4 :(得分:1)

理论上,没有理由不这样做,除了列名与表名相同这一事实。也许您的数据库引擎对此感到困惑,请尝试重命名。

答案 5 :(得分:1)

尝试替换下面的表名,并检查如果该列也没有出现,则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)))