【问题标题】:How to Organize Multiple Joins SQL如何组织多个连接 SQL
【发布时间】:2016-10-06 17:58:56
【问题描述】:

在 SQL 中,当我在一个查询中执行多个连接时,我应该如何将表连接在一起。我应该只加入一个表 - 在这种情况下是客户表还是可以做我所做的事情(在需要新键时加入不同的表)?

SELECT O.OrderID, O.OrderDate, C.City, C.Country, C.PostalCode, C.ContactName, O.CustomerID, O.ShipperID, D.ProductID, COUNT(D.ProductID) ProductCount, S.SupplierID
FROM Customers C

INNER JOIN Orders O 
        ON O.CustomerID = C.CustomerID
INNER JOIN OrderDetails D 
        ON O.OrderID = D.OrderID
INNER JOIN Products P
        ON D.ProductID = P.ProductID
INNER JOIN Suppliers S
        ON S.SupplierID = P.SupplierID 

WHERE 1 = 1
GROUP BY O.OrderID
ORDER BY OrderDate DESC

我正在使用 W3Schools SQL TryIt 编辑器进行测试,不知道它是什么数据库引擎!

谢谢!

【问题讨论】:

    标签: sql join normalization


    【解决方案1】:

    当然,您可以在一个查询中加入多个表。这是 SQL 强大功能的重要组成部分。

    在您的特定情况下,您不需要加入Suppliers 表,因为该列已经在Products 中。

    另外,您需要注意SELECTGROUP BY 子句。一般来说,你应该把所有非聚合列放在GROUP BY

    SELECT O.OrderID, O.OrderDate, C.City, C.Country, C.PostalCode, C.ContactName, 
           O.CustomerID, O.ShipperID, D.ProductID,
           COUNT(D.ProductID) as ProductCount,
           P.SupplierID
    FROM Customers C INNER JOIN
         Orders O 
         ON O.CustomerID = C.CustomerID INNER JOIN
         OrderDetails D 
         ON O.OrderID = D.OrderID INNER JOIN
         Products P
         ON D.ProductID = P.ProductID
    GROUP BY O.OrderID, O.OrderDate, C.City, C.Country, C.PostalCode, C.ContactName, 
           O.CustomerID, O.ShipperID, D.ProductID, P.SupplierId
    ORDER BY OrderDate DESC;
    

    WHERE 1=1 也是不必要的。

    我想知道这个查询是否真的符合您的要求。但是,您并没有说明您真正希望查询做什么,所以我只是在推测。

    【讨论】:

    • 我建议也删除WHERE 1=1
    • @FelixPamittan 我以前听说过,这是什么原因?
    • @jacob-on-stackoverflow 没必要。 1 = 1 将始终为真,因此包含它没有任何意义。
    【解决方案2】:

    您的方法是查找,不要忘记对于每个内部连接,您的记录集可能会减少每个附加连接中不匹配键的数量。

    您也可以只使用 JOIN 语法。

    【讨论】:

      猜你喜欢
      • 2018-07-28
      • 2019-04-28
      • 1970-01-01
      • 1970-01-01
      • 2018-05-26
      • 2018-02-10
      • 1970-01-01
      • 2023-04-01
      • 1970-01-01
      相关资源
      最近更新 更多