【问题标题】:How do I resolve multi-part identifier errors如何解决多部分标识符错误
【发布时间】:2021-09-01 20:16:53
【问题描述】:

我无法通过以下查询找出问题:

select distinct  
    i.Supplr1, v.Name, s.InvtID, s.CuryCost, s.CurySlsPrice, s.OrdNbr,
    Sum(s.CurySlsPrice - s.CuryCost) AS GrossProfit,
    Sum((s.CurySlsPrice - s.CuryCost)/s.CurySlsPrice) AS GrossPer
from
    SOLine s, Inventory i, Vendor v
Inner Join 
    Inventory on Inventory.InvtID = s.InvtID
Inner join 
    Vendor on Vendor.VendID = Inventory.Supplr1

Union All

select distinct  
    a.InvtID, s.OrdNbr, s.OrdNbr, s.CuryCost, s.CurySlsPrice, s.OrdNbr,    
    s.Status, a.PerPost
from 
    ARTran a, Inventory i, SOLine S 
Inner join 
    Inventory on Inventory.InvtId = ARTran.InvtID
Inner join 
    ARTran on ARTran.OrdNbr = SOLine.OrdNbr

错误如下:

消息 4104,第 16 级,状态 1,第 20 行
无法绑定多部分标识符“s.InvtID”。

消息 4104,第 16 级,状态 1,第 31 行
无法绑定多部分标识符“ARTran.InvtID”。

消息 4104,第 16 层,状态 1,第 33 行
无法绑定多部分标识符“SOLine.OrdNbr”。

我已经尝试了我所知道的一切(我的大脑可能有点糊涂)但仍然出现错误。

我的查询有什么问题?

【问题讨论】:

  • 能否请您发布SOLineARTran 的表架构。
  • WHY 你在FROM 子句中使用逗号分隔列表中的三个表(这是不鼓励,应该避免!),以及正确的JOIN 语句?应该使用正确的JOINs - 他们应该得到表别名JOIN Inventory i ON i.InvtID = s.InvtID。如果您像这样清理查询,它应该可以正常工作
  • 你为什么将join 语法与 30 多年前的语法混合在一起?您正在重复表格,这是您的问题。
  • 是这个完整的查询。我看到第 31、33 行,它们在您的代码中不存在
  • 显式连接在之前以逗号分隔,隐式连接。这意味着Vendor v Inner Join Inventory 只能引用ON 子句中的v 和Inventory 列。

标签: sql sql-server tsql


【解决方案1】:

你应该把你的查询清理成这样:

  • 使用正确的 JOIN 语法 - 摆脱 FROM 子句中那个陈旧、糟糕的“逗号分隔的表列表”!

  • 在连接的表上使用表别名

试试这个:

SELECT 
    i.Supplr1, v.Name, s.InvtID, s.CuryCost, s.CurySlsPrice, s.OrdNbr,
    SUM(s.CurySlsPrice - s.CuryCost) AS GrossProfit,
    SUM((s.CurySlsPrice - s.CuryCost)/s.CurySlsPrice) AS GrossPer
FROM
    SOLine s
INNER JOIN 
    Inventory i ON i.InvtID = s.InvtID
INNER JOIN 
    Vendor v ON v.VendID = i.Supplr1
GROUP BY
    i.Supplr1, v.Name, s.InvtID, s.CuryCost, s.CurySlsPrice, s.OrdNbr

UNION ALL

SELECT DISTINCT  
    a.InvtID, s.OrdNbr, s.OrdNbr, s.CuryCost, s.CurySlsPrice, s.OrdNbr,    
    s.Status, a.PerPost
FROM 
    SOLine s
INNER JOIN 
    Inventory i ON i.InvtId = a.InvtID
INNER JOIN 
    ARTran a ON a.OrdNbr = s.OrdNbr

【讨论】:

  • 如果你要清理代码,DISTINCT 在第一个查询中没有任何用处,它需要一个 GROUP BY 子句来求和。
  • @SMor:谢谢——你说得对——我已经更新了我的回复,并添加了GROUP BY——是时候删除反对票了 :-)
【解决方案2】:

您选择的列不存在。检查您的数据库架构

【讨论】:

    猜你喜欢
    • 2011-10-12
    • 1970-01-01
    • 2020-06-16
    • 2016-10-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-25
    相关资源
    最近更新 更多