SQL Server › Subqueries
How would you rewrite a slow correlated subquery as an equivalent, potentially faster JOIN based query?
AdvancedAnswer
You identify the relationship being checked by the correlated subquery, and express that same logic using a JOIN combined with either GROUP BY for aggregation needs or DISTINCT for simple existence checks, which often allows SQL Server's optimizer to process the entire operation as a single efficient set based operation instead of repeatedly executing the subquery for each outer row.
-- Correlated subquery approach
SELECT c.Name, (SELECT COUNT(*) FROM Orders o WHERE o.CustomerId = c.CustomerId) AS OrderCount FROM Customers c;
-- Equivalent JOIN based approach
SELECT c.Name, COUNT(o.OrderId) AS OrderCount
FROM Customers c LEFT JOIN Orders o ON c.CustomerId = o.CustomerId
GROUP BY c.Name;Real-world example A team rewrites a slow report that used a correlated subquery to count each customer's orders into an equivalent LEFT JOIN with GROUP BY, cutting the report's execution time significantly on their large customer table.