2016-06-07 60 views
0

在SQL中,當我在一個查詢中執行多個連接時,應如何將表連接在一起。我應該只加入一張桌子 - 在這種情況下,顧客桌子還是可以做我所做的事情(在需要新密鑰時加入不同的桌子)?如何組織多個連接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編輯器來測試這個,不知道它是什麼數據庫引擎!

謝謝!

回答

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也是不必要的。

我想知道這個查詢是否真的做到了你想要的。然而,你並沒有說明你實際上想要查詢的內容,所以我只是在猜測。

+0

我建議刪除'WHERE 1 = 1'。 –

+0

@FelixPamittan我以前聽說過這個,推理是什麼? –

+0

@ jacob-on-stackoverflow沒有必要。 '1 = 1'永遠是真的,所以包括它沒有任何意義。 –

1

您已經完成的方式是找到,不要忘記,對於每個內部聯接,您的記錄集可能會減少每個附加聯接中不匹配鍵的數量。

你也可以使用JOIN語法。