如何组织多个联接 SQL

How to Organize Multiple Joins SQL

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

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 编辑器来测试这个,不确定它是什么数据库引擎!

谢谢!

当然,您可以在一个查询中加入多个 table。这是 SQL.

的很大一部分力量

在您的特定情况下,您不需要连接到 Suppliers table,因为该列已经在 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也是不必要的

我想知道这个查询是否真的符合您的要求。但是,您没有说明您实际希望查询执行的操作,所以我只是推测。

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

您也可以只使用 JOIN 语法。