【问题标题】:SQL Multipart Incorrect Syntax, Aggregate Function, Multipart Identifier can not be boundSQL Multipart 语法错误、聚合函数、Multipart Identifier 无法绑定
【发布时间】:2013-05-15 21:20:09
【问题描述】:

我已经尝试了几个小时来自学并学习如何使用我的虚拟测试数据列出所有客户以及他们每个人下的订单。我想返回 CustomerID、CustomerName、OrderTypeName 和计数“OrderCount”

我尝试了几种在网上找到的不同方法和技术,但我不断遇到类似/不同的问题,这些问题都与我无法弄清楚的明显简单的解决方案有关。

这是我当前的查询。

SELECT 
    c.CustomerID, c.CustomerName, t.OrderTypeName
FROM 
    tblCustomer c, tblOrder o, tblOrderType t
INNER JOIN
    (SELECT 
         o.CustomerID, COUNT(o.CustomerID) AS OrderCount
     FROM
         tblOrder o, tblCustomer c
     WHERE 
         o.CustomerID = c.CustomerID)
ORDER BY CustomerName;

这个目前在关键字'ORDER'附近给出错误语法的错误。

【问题讨论】:

  • Bad habits to kick : using old-style JOINs - 旧式 逗号分隔的表格列表 样式已随 ANSI-92 SQL 标准(超过 20 年前)。而且您绝对不应该混合这两种样式 - 使用逗号分隔的表格列表,然后混合使用 INNER JOIN ... 切换到正确的 ANSI JOIN 语法 - 你不会后悔的它!
  • 您必须指定要执行连接的列。这是唯一的错误。请参阅 Dibster 的回答。

标签: sql sql-server tsql


【解决方案1】:

您将旧式联接与逗号分隔的表列表和正确的 ANSI 标准 INNER JOIN 混合在一起 - 但您没有提供任何 联接条件

我的建议:习惯 ANSI 标准并一直使用它!

SELECT 
    c.CustomerID, c.CustomerName, t.OrderTypeName
FROM 
    tblCustomer c
INNER JOIN 
    tblOrder o ON ..(what links tblOrder and tblCustomer??) ....
INNER JOIN
    tblOrderType t ON ....(what links OrderType and Order??) ....
INNER JOIN
    (SELECT 
         o.CustomerID, COUNT(o.CustomerID) AS OrderCount
     FROM
         tblOrder o
     INNER JOIN
         tblCustomer c ON .....(missing join condition again).....
     WHERE 
         o.CustomerID = c.CustomerID) x ON .....(again: missing join condition here).....
ORDER BY CustomerName;

【讨论】:

  • 感谢 Marc 的清晰解释,我想我在浏览我的 Microsoft SQL Server 2012“初学者指南”以及我发现的在线解释和教程时,使用了一点两者兼而有之。我尝试了您向我展示的内容和 Dibstar 在下面发布的内容,它们都有效,尽管 Dibstar 的代码较少。如果你不介意我问的话,你和他之间的命名区别是什么,以及一个人对另一个人的好处是什么?
【解决方案2】:

假设 ordertype 表如何连接到 orders 表:

SELECT 
c.CustomerID
,c.CustomerName
,t.OrderTypeName
,COUNT(o.customer_id) as num_orders
FROM tblCustomer c
INNER JOIN tblOrder o on o.customer_id = c.customer_id
INNER JOIN tblOrderType t ON t.order_id = o.order_id
GROUP BY
c.CustomerID
,c.CustomerName
,t.OrderTypeName
ORDER BY 
c.customer_id

【讨论】:

    【解决方案3】:

    当您执行JOIN 时,您需要指定要连接这两个表的字段:

    例如:

    select t1.a,t2.b from table1 t1 join table2 t2 on t1.id= t2.id
    

    所以我猜你没有正确阅读你说的指南。

    要解决您的问题,您需要选择要使用的语法类型。逗号分隔(非常旧)或提供join condition 的那个(推荐)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-02-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多