2016-11-29 167 views
1

我想创建一个基于试图找到一个表中的一列中的值基于另一个表中另一列的值的查询。这是迄今为止我所编写的代码,尽管列名和表被声明,但是列名不明确?

SELECT OrderDetails.OrderDetailID FROM OrderDetails 
INNER JOIN OrderDetails 
ON Products.ProductID = OrderDetails.ProductID 
WHERE Products.SupplierID="5"; 

通过执行的代码,我想找到将订单表中的行,其中供应商ID在Products表5。例如OrderDetailID,

Highlighted Products Table

“QUESO卡夫拉莱斯”的供应商ID是5和它的产品ID是11。这相当于在11桌的OrderDetail外键,所以我想返回该行的主键。在这种情况下,1

Highlighted OrderDetails Table

目前,我得到一个“不明确的列名”错误,即使我已经宣布这两个表和列名第一线。另外,我该如何让SQL获取有关其他表的数据。我知道我不想使用“INNER JOIN”,但我该如何执行,以便可以使用WHERE命令。

+1

你''JOIN'ing到OrderDetails''OrderDetails'上'Products.ProductId'。也许你打算在'OrderDetails'和'Products'上做'JOIN'而不是? – Siyual

回答

1

您在FROM条款中有两次OrderDetails,但没有Products。我想你的意思是:

SELECT od.OrderDetailID 
FROM OrderDetails od INNER JOIN 
    Products p 
    ON p.ProductID = od.ProductID 
WHERE p.SupplierID = 5; 

注:

  • 表的别名使查询更容易编写和读取(在odp)。
  • 不要在数字常量周围使用分隔符。我假设SupplierId是一个数字,所以我删除了双引号。
+1

特别喜欢关于删除引号的补充评论,如果不必要的话。解决整个问题的方法,而不仅仅是基本问题。 – xQbert

0

使用两个时间同一列,所以你必须resove的amvbiguity例如:这种方式(使用两个不同的别名OD1,OD2)

SELECT od1.OrderDetailID FROM OrderDetails od1 
    INNER JOIN OrderDetails as od2 
    ON Products.ProductID = od2.ProductID 
    WHERE Products.SupplierID="5"; 
+0

但随后'products.productID'会失败:P为会'products.supplierID'我认为他们打算使用一次的产品。 – xQbert

+0

我不是在查询的逻辑..但歧义是有关的事实,OP是使用两个时间相同的表......没有适当的别名.. – scaisEdge

0

一个问题是:INNER JOIN旨在生成重复结果中的列。此问题已得到解决1992年时,SQL标准的介绍,不产生重复的属性“关系”的连接类型:

SELECT OrderDetailID 
    FROM OrderDetails 
     NATURAL JOIN Products 
WHERE SupplierID = 5;