不明白为什么我收到这个错误

时间:2011-10-12 16:21:36

标签: sql database

这是我做的代码

  SELECT TOP 5  ContactName FROM Customers
INNER JOIN [Order Details]ON OrderId = 
CustomerID
INNER JOIN Orders ON ProductID = OrderID
WHERE UnitPrice >= 25000
ORDER BY ContactName ASC

但这是我得到的错误

   Msg 209, Level 16, State 1, Line 5
Ambiguous column name 'orderID'

有人可以向我解释为什么我会收到此错误。

我正在尝试做的是显示从花费超过25,000美元的客户处购买的最近五个订单

所以我假设使用订单,产品和客户。

6 个答案:

答案 0 :(得分:3)

两个表中都存在OrderID列。

答案 1 :(得分:1)

您肯定在orderIDDetails表格中都有字段Orders

使用Orders.orderIDDetails.orderID澄清它。

答案 2 :(得分:1)

OrderIDOrder Details表中可能都有Orders列,而SQL Server不知道要采用哪一列。

解决方案:通过将表名放在前面来指定您要使用的那个:
Orders.OrderID而非OrderID

因此,您的查询将如下所示:

SELECT TOP 5  ContactName FROM Customers
INNER JOIN [Order Details]ON Orders.OrderId = 
CustomerID
INNER JOIN Orders ON ProductID = Orders.OrderID
WHERE UnitPrice >= 25000
ORDER BY ContactName ASC

答案 3 :(得分:1)

表格中有2个OrderID列 您可以使用别名删除歧义(如此)或使用Orders.OrderID

SELECT TOP 5 C.ContactName 
FROM 
  Customers C
  INNER JOIN 
  [Order Details] OD ON C.OrderId = OD.CustomerID
  INNER JOIN
   Orders O ON OD.ProductID = O.OrderID
WHERE O.UnitPrice >= 25000 -- or OD?
ORDER BY C.ContactName ASC

注意:你是说joion Customers和[Order Details]就像使用Customers.OrderId一样?

答案 4 :(得分:0)

当您在同一查询中JOIN多个表时,需要区分多个表中具有相同名称的任何列。否则,查询引擎将如何知道您正在谈论哪一个?

您可以通过在列名称前添加<table name>.<table alias>.作为前提。

例如:

SELECT TOP 5
    C.ContactName
FROM
    Customers C    -- Customers is aliased as "C"
INNER JOIN [Order Details] OD ON
    OD.OrderId = C.CustomerID
INNER JOIN Orders O ON
    OD.ProductID = O.OrderID
WHERE
    OD.UnitPrice >= 25000
ORDER BY
    C.ContactName ASC

另一个重要问题......你确定你正在加入正确的列吗?看起来真的错误。

最后,如果这是作业作业,请确保使用“作业”标签将其标记为。

答案 5 :(得分:0)

在对OrderId的引用中,您需要确定从哪个表中提取orderId列。 (在某些情况下,您可以选择任一表格)。我们打电话给那张桌子。

在您的查询中,将orderId替换为.orderId。