Существующий подход может дать ложные результаты, так как вы получите строки, которые не соответствуют ни одному из условий, только если 1 строка соответствует.Этого можно избежать, если использовать существующий в коррелированном подзапросе, но я не достаточно экспериментировал с этим, чтобы рекомендовать.
Для скорости я бы пошел на перекрестное применение и указал бы родительскую таблицу в перекрестном применении.выражение (коррелированный подзапрос для создания производной таблицы).Таким образом, условие соединения указывается перед возвратом данных, если у рассматриваемых столбцов есть индексы (т.е. они являются первичными ключами), то оптимизатор может разработать эффективный план для этого.
Объединение всехиспользуется в выражении перекрестного применения, поскольку это предотвращает четкую сортировку в производной таблице, которая, как правило, более тяжелая с точки зрения стоимости, чем возврат самих данных (объединение должно идентифицировать все строки в любом случае, включая дубликаты).
Наконец, еслиэто все еще медленно, тогда, возможно, вы захотите добавить индекс к столбцу даты в таблице a.Это преодолевает недостаток гибкости, свойственный столбцу даты, и означает, что оптимизатор может использовать индекс, а не сканировать все строки в наборе результатов и проверять, совпадает ли дата с сегодняшним днем.
Select someCols from A
inner join B left join C
cross apply (Select Z.colseekedinA from tab Z where a.col=z.colseekedinA
union all
Select X.colseekedinA from tab X where a.col=x.colseekedina) d
Where A.date = Today