Условные внешние применяются в зависимости от результата применения различных внешних

У меня есть запрос, который должен извлекать данные из нескольких таблиц. Для двух из этих таблиц данные извлекаются outer apply , так как необходимо запросить временной диапазон для данных.

 SELECT a.DATA, b1.DATA, c1.DATA FROM TABLE_A a OUTER APPLY (SELECT TOP 1 b.[DATA] FROM TABLE_B b WHERE b.TIME_START <= a.TIME_START ) AS b1 OUTER APPLY (SELECT TOP 1 c.[DATA] FROM TABLE_C c WHERE c.TIME_START <= a.TIME_START AND c.TIME_STOP >= a.TIME_START ) AS c1 

Моя проблема в том, что TABLE_C – очень большая таблица, и запрос этой таблицы занимает некоторое время, но мне нужно было бы запросить эту таблицу, если результат из TABLE_B равен NULL. TABLE_B довольно мал по сравнению с TABLE_C .

Например, это действительный результат запроса:

  [a.DATA] [b.DATA] [c.DATA] 1 VALUE_A VALUE_2 NULL 2 VALUE_B NULL VALUE_3 

Есть ли способ сделать внешний применимым к TABLE_C условным к результату TABLE_B для каждой строки, как в приведенном выше примере, только для строки 2?

Что-то вроде этого:

 SELECT a.DATA , b1.DATA , c1.DATA FROM TABLE_A a OUTER APPLY ( SELECT TOP 1 b.[DATA] FROM TABLE_B b WHERE b.TIME_START <= a.TIME_START ) AS b1 OUTER APPLY ( SELECT CASE WHEN b1.[DATA] IS NULL THEN ( SELECT TOP 1 c.[DATA] FROM TABLE_C c WHERE c.TIME_START <= a.TIME_START AND c.TIME_STOP >= a.TIME_START ) ELSE NULL END AS DATA ) AS c1 

Или:

  SELECT a.DATA , b1.DATA , c1.DATA FROM TABLE_A a OUTER APPLY ( SELECT TOP 1 b.[DATA] FROM TABLE_B b WHERE b.TIME_START <= a.TIME_START ) AS b1 OUTER APPLY ( SELECT TOP 1 c.[DATA] FROM TABLE_C c WHERE c.TIME_START <= a.TIME_START AND c.TIME_STOP >= a.TIME_START AND b1.[DATA] IS NULL ) AS c1 
 SELECT a.DATA, b1.DATA, c1.DATA FROM TABLE_A a OUTER APPLY (SELECT TOP 1 b.[DATA] FROM TABLE_B b WHERE b.TIME_START <= a.TIME_START ) AS b1 OUTER APPLY (SELECT TOP 1 c.[DATA] FROM TABLE_C c WHERE c.TIME_START <= a.TIME_START AND c.TIME_STOP >= a.TIME_START AND b1.data IS NULL ) AS c1 

Но я не знаю, что оптимизатор будет делать в этом случае. Будет ли он принимать все данные с C и после этого удалить все записи с B. Однако вы также можете попытаться дублировать запрос:

 SELECT a.DATA, b1.DATA, c1.DATA FROM TABLE_A a OUTER APPLY (SELECT TOP 1 b.[DATA] FROM TABLE_B b WHERE b.TIME_START <= a.TIME_START ) AS b1 OUTER APPLY (SELECT TOP 1 c.[DATA] FROM TABLE_C c WHERE c.TIME_START <= a.TIME_START AND c.TIME_STOP >= a.TIME_START AND NOT EXISTS ( SELECT * FROM TABLE_B b WHERE b.TIME_START <= a.TIME_START ) ) AS c1 
Interesting Posts

Msgstr "Указанное" @notify_email_operator_name "неверно".

T-SQL Parse XML с одинаковыми узлами в одной строке

Как я могу запросить базу данных SQL для многих результатов, которые не имеют общих критериев?

Поставщик для SQL Server не регистрируется на локальной машине

Sql Server Вставить запрос В несколько таблиц из временных таблиц

Представление SQL Server: как добавить отсутствующие строки с помощью интерполяции

Изменить формат даты в C # при чтении из базы данных и настройке на метку

Падение индексов или изменение

Преобразование временной метки терадата (6) в datetime для SQL Server

Я не понимаю предложение FROM с ON в неожиданном месте

Как легко добавить столбцы в временную таблицу?

Добавить столбец и обновить его в транзакции

Как я могу сгенерировать предыдущую таблицу значений, объединив поля из таблицы SQL?

Мне нужно преобразовать мою базу данных Mysql в базу данных SQL Server 2005

Возможно ли получить доступ к базе данных .mdf без SQL Server?

Давайте будем гением компьютера.