【问题标题】:How can I fix the SQL Query error 'invalid column name'?如何修复 SQL 查询错误“无效的列名”?
【发布时间】:2017-10-05 02:18:46
【问题描述】:

我正在 SQL 服务器上的 VBA 中运行以下查询。为了简化,我为 select 子句中的不同列使用了别名。 VBA 返回以下错误:

列名“QtyDCo”无效。

我尝试添加括号和引号,但没有帮助。有没有人知道如何解决这个错误?

"SELECT Qry_ETD_Pos_Combined.colDate AS [Date], " & _
    " Qry_ETD_Pos_Combined.colClrBroker AS [Clr Broker], " & _
    " Qry_ETD_Pos_Combined.colAccount AS Account, " & _
    " tblDefProd.colInstr AS [FT/OP], tblDefProd.colCcy, " & _
    " Qry_ETD_Pos_Combined.colId AS Instrument,  tblDefDeriv.colExpiry, " & _
    " tblDefProd.colMultiplier AS Multiplier, " & _
    " IsNull(tblDatPositionsCalc.colLots,0) AS QtyDCo, " & _
    " IsNull(tblDatPositions.colLots,0) AS QtyBrk, " & _
    " QtyDCo - QtyBrk AS [Qty Diff], " & _
    " IsNull(tblDatPositions.colMktPrice,0) AS [Price(ETD)], " & _
    " IsNull(tblDatDeriv.colPrevClose,0) AS [Price(BBG)], " & _
    " [Price(ETD)]-[Price(BBG)] AS [Mkt Price Diff], " & _
    " Round(IsNull(tblDatPositionsCalc.colPrice,0),8) AS [Avg Price D&Co], " & _
    " IsNull(tblDatPositions.colPrice,0) AS [Avg Price Brk], " & _
    " Round([Avg Price D&Co]-[Avg Price Brk],5) AS [Avg Price Diff], " & _
    " IIf([Qty D&Co]=0,0,Round(IIf([FT/OP]='FT',tblDatPositionsCalc.colLots*tblDefProd.colMultiplier*([Price(ETD)]-[Avg Price D&Co]),IIf([FT/OP]='OP',tblDatPositionsCalc.colLots*tblDefProd.colMultiplier*IsNull([Price(ETD)],[Price(BBG)]),0)),2)) AS [Mkt Val D&Co], IsNull(tblDatPositions.colVarMar,0) AS [Mkt Val Brk], Round([Mkt Val D&Co]-[Mkt Val Brk],2) AS [Mkt Val Diff], " & _
    "Round(IIf([FT/OP]='OP',-[Qty D&Co]*[Multiplier]*[Avg Price D&Co],0),2) AS [Trade Val D&Co], Round(IIf([FT/OP]='OP',-[Qty Brk]*[Multiplier]*[Avg Price Brk],0),2) AS [Trade Val Brk], [Trade Val D&Co]-[Trade Val Brk] AS [Trade Val Diff], tblDatAdmFX.colSpot AS FX, " & _
    "Round([Mkt Val D&Co]*[FX],2) AS [Mkt Val CHF], Round([Trade Val D&Co]*[FX],2) AS [Trade Val CHF] " & _
    "FROM (((((" & MyQryPosComb & " AS Qry_ETD_Pos_Combined LEFT JOIN dbOps.dbo.tblDatPositions ON (Qry_ETD_Pos_Combined.colId = tblDatPositions.colId) " & _
    "AND (Qry_ETD_Pos_Combined.colAccount = tblDatPositions.colAccount) " & _
    "AND (Qry_ETD_Pos_Combined.colDate = tblDatPositions.colDate)) LEFT JOIN dbOps.dbo.tblDatPositionsCalc ON (Qry_ETD_Pos_Combined.colId = tblDatPositionsCalc.colId) " & _
    "AND (Qry_ETD_Pos_Combined.colAccount = tblDatPositionsCalc.colAccount) " & _
    "AND (Qry_ETD_Pos_Combined.colDate = tblDatPositionsCalc.colDate)) LEFT JOIN dbProd.dbo.tblDefDeriv ON Qry_ETD_Pos_Combined.colId = tblDefDeriv.colId) LEFT JOIN dbProd.dbo.tblDefProd ON tblDefDeriv.colProduct = tblDefProd.colProduct) LEFT JOIN dbMktData.dbo.tblDatDeriv ON (Qry_ETD_Pos_Combined.colDate = tblDatDeriv.colDate) " & _
    "AND (Qry_ETD_Pos_Combined.colId = tblDatDeriv.colId)) LEFT JOIN dbMktData.dbo.tblDatFX ON Qry_ETD_Pos_Combined.colDate = tblDatFX.colDate " & _
    "WHERE (tblDatFX.colCcy1=[tblDefProd].[colCcy] AND tblDatFX.colCcy2='CHF');"

【问题讨论】:

  • 您无法在 select 子句中引用别名,请尝试使用子查询或列本身。

标签: sql-server vba


【解决方案1】:

您需要使用子查询或CTE 首先定义 QtyDCo 列,然后在外部/最终查询中引用它。

SQL 的定义是,SELECT 子句中的所有表达式都“好像”都是并行计算的1。因此,您不能在同一 SELECT 子句中引用您也在定义的列。

1相对于例如被定义为从左到右计算。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-15
    • 2022-01-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多