Mastering SQL Cross Apply and Outer Apply Joins

Mastering SQL Cross Apply and Outer Apply Joins

In the diverse world of SQL Server, the terms ‘Cross Apply’ and ‘Outer Apply’ often crop up, especially among those delving deeper into advanced querying techniques.

While traditional joins like Inner and Outer Joins are commonplace, Cross Apply and Outer Apply joins offer unique functionalities that can be game-changers in specific scenarios. This blog post aims to demystify these joins, illustrate their uses, and show how they can enhance your SQL querying capabilities.

Introduction to Cross Apply and Outer Apply Joins

At their core, Cross Apply and Outer Apply are SQL Server’s extensions to the standard SQL specification. They are particularly useful when working with table-valued functions, allowing you to join a table to a function as if it were another table. The critical difference between them lies in how they handle non-matching rows.

Cross Apply Join

  • Functionality: The Cross Apply join works like an Inner Join. It returns rows from the left table only if the table-valued function returns results for that row.
  • Use Case: Ideal for situations where you must combine each table row with a dynamic set of rows from a table-valued function.
  • Example Scenario: Suppose you have a table of employees and a function that returns the last five sales made by each employee. Cross Apply can list each employee alongside their last five sales.

Outer Apply Join

  • Functionality: The Outer Apply join is similar to a Left Outer Join. It returns all rows from the left table, and if the table-valued function does not return any result for a row, it includes that row in the result set with NULLs in the columns returned by the function.
  • Use Case: Useful when you ensure that all rows from the left table appear in the result set, even if the function returns no data for them.
  • Example Scenario: Continuing the previous example, if you want to list all employees, including those with no sales, Outer Apply will include those with NULLs in the sales-related columns.

Why Use Cross Apply and Outer Apply?

  1. Flexibility with Dynamic Data: These joins allow for a more dynamic relationship between tables and functions, where the function’s output can depend on the row from the table it joins.
  2. Performance Efficiency: In some instances, they can be more efficient than traditional joins, especially when dealing with complex calculations or transformations.
  3. Enhanced Data Manipulation: They offer a more powerful way to manipulate and transform data, enabling complex queries that might be cumbersome or impossible with standard joins.

Writing Queries with Cross Apply and Outer Apply

  • Basic Syntax:
    • Cross Apply: SELECT * FROM Table1 CROSS APPLY Function(Table1.Column)
    • Outer Apply: SELECT * FROM Table1 OUTER APPLY Function(Table1.Column)
  • In Practice: Suppose you have a function GetRecentTransactions(UserID) that returns a user’s recent transactions. To get a list of all users and their recent transactions, you would use Outer Apply. If you only wanted to list users who have had recent transactions, you would use Cross Apply.


Cross Apply and Outer Apply joins in SQL Server are powerful tools that offer enhanced flexibility and functionality in data querying. While they might seem complex initially, understanding their use cases and functionalities can significantly expand your SQL querying prowess, allowing for more sophisticated and dynamic data manipulation.


Hi, my name is Stephen Finchett. I have been a software engineer for over 30 years and worked on complex, business critical, multi-user systems for all of my career. For the last 15 years, I have been concentrating on web based solutions using the Microsoft Stack including ASP.Net, C#, TypeScript, SQL Server and running everything at scale within Kubernetes.