CROSS APPLY - это не просто JOIN. JOIN находит совпадающие (или не совпадающие) строки между двумя наборами данных. CROSS APPLY - это метод для выполнения запроса к каждой строке того, к чему вы применяете. Это может действовать как механизм фильтрации, что-то вроде того, как работает JOIN, но он применяет что-то к каждой строке, поэтому об этом нужно думать таким образом.
EXISTS в подзапросе - это совершенно другой механизм фильтрации. Это метод быстрой идентификации, потому что он сразу же замыкает свой поиск, когда что-то находит. В общем, вы хотели бы использовать EXISTS, когда вы, вероятно, получите удар по критериям фильтра, тем самым сделав поиск максимально коротким. Но EXISTS не находит все совпадения. Он просто находит первое совпадение, а затем прекращает поиск.
Так что, хотя вы можете получить одинаковые результаты с помощью этих трех различных методов, используйте их, как определено, и вы, как правило, будете правы. Если вы буквально СОЕДИНЯЕТЕ два набора данных, используйте JOIN. Если вы хотите запустить процесс, часто фильтр, для каждой строки в наборе данных, используйте CROSS APPLY. Если вам нужен быстрый фильтр для вероятного положительного совпадения, используйте EXISTS.