混合使用 LEFT JOIN 與 INNER JOIN 可實現「以某表為基準保留所有行,再對關聯表做嚴格匹配篩選」的靈活查詢。
-- 需求:列出所有客戶,若有訂單則顯示訂單金額,並只保留金額 > 1000 的訂單行 SELECT c.CustomerID, c.Name, o.OrderID, o.Amount FROM Customers c LEFT JOIN Orders o ON c.CustomerID = o.CustomerID AND o.Amount > 1000; -- 條件放在 ON 子句,不影響左表保留 -- 對比:條件放在 WHERE 會變成 INNER JOIN 效果 SELECT c.CustomerID, c.Name, o.OrderID, o.Amount FROM Customers c LEFT JOIN Orders o ON c.CustomerID = o.CustomerID WHERE o.Amount > 1000; -- 無訂單或金額≤1000 的客戶行被過濾掉
SELECT c.Name, o.OrderID, od.ProductID, p.ProductName FROM Customers c LEFT JOIN Orders o ON c.CustomerID = o.CustomerID INNER JOIN OrderDetails od ON o.OrderID = od.OrderID LEFT JOIN Products p ON od.ProductID = p.ProductID;
o.*、od.*、p.* 全為 NULL (因 INNER JOIN 要求 o.OrderID 存在,左表無訂單時 o.OrderID 為 NULL,導致內連結失敗,整行只剩客戶欄位)。LEFT JOIN 串聯。STRAIGHT_JOIN 或括號控制優化器。