CROSS APPLY is not like JOIN. JOIN finds matching (or non-matching) rows between two datasets. CROSS APPLY is a method to run a query on each line of what you use it with. It may act as a filtering mechanism, something like the way JOIN works, but it applies something to each line, so you need to think about it.
EXISTS in a subquery is a completely different filtering mechanism. This is a quick identification method, because he immediately closes his search when he finds something. The place where you want to use EXISTS in general is when you are likely to get hit by the filter criteria, thereby making the search as short as possible. But EXISTS does not find all matches. He simply finds the first match and then stops the search.
So, while you can get the same results from these three different methods, use them as specific, and you will be right in the usual way. If you are literally connecting to two datasets, use JOIN. If you want to start a process, often a filter, for each row in a data set, use CROSS APPLY. If you need a quick filter with a likely positive match, use EXISTS.
source share