查询德国客户订单时SQL返回全组合而非唯一结果的解决方法
问题原因与解决办法
你的SQL返回所有组合是因为没有添加表之间的关联条件,四个表直接用逗号放在FROM里会产生笛卡尔积,也就是把每个表的所有行两两组合,自然不是你要的真实订单数据。
要解决这个问题,需要用显式JOIN语句把表之间的关联关系明确写出来,这几个表的关联逻辑是:
- Customers表和Orders表通过
CustomerID关联(客户下订单) - Orders表和[Order Details]表通过
OrderID关联(订单包含商品明细) - [Order Details]表和Products表通过
ProductID关联(明细对应具体商品)
正确的SQL代码如下:
SELECT Products.ProductName, Orders.OrderID, [Order Details].Quantity, [Order Details].UnitPrice * [Order Details].Quantity AS Total_Price FROM Customers INNER JOIN Orders ON Customers.CustomerID = Orders.CustomerID INNER JOIN [Order Details] ON Orders.OrderID = [Order Details].OrderID INNER JOIN Products ON [Order Details].ProductID = Products.ProductID WHERE Customers.Country = 'Germany'
补充说明:
- 用
INNER JOIN确保只返回有对应关联关系的数据(比如只返回确实有订单的德国客户,以及订单里确实存在的商品) - 这里把
Total_Price改成了计算字段——因为通常[Order Details]表里不会直接存总价,而是用UnitPrice * Quantity计算得到(如果你的表确实有Total_Price字段,可以改回原写法) - 给
Country字段加上表前缀Customers.,避免字段歧义(如果其他表也有同名字段的话)
内容的提问来源于stack exchange,提问作者Tsenguun Oyunchimeg
相关产品推荐
相关产品推荐

