2013-08-23 4 views
-1

У меня есть подзапрос, который будет делать LEFT JOIN на трех разных таблицах. Затем у меня есть четвертая таблица, которая объединена с идентификатором, который будет содержать только одну из трех ранее включенных таблиц.Эффективное использование креста применяется?

SELECT 
(
    IIF 
    ( 
    NOT EXISTS(
     SELECT * FROM A 
     LEFT JOIN B ON 
      (A.Col1 = B.Col1) 
     LEFT JOIN C ON 
      (A.Col2 = C.Col2) 
     LEFT JOIN D ON 
      (A.Col3 = D.Col3) 
     LEFT JOIN E ON 
      (B.SomeID = E.SomeID) 
      OR 
      (C.SomeID = E.SomeID) 
      OR 
      (D.SomeID = E.SomeID) 
     WHERE A.SomeCondition = T.SomeCondition 
     1, 
     0 
) AS SomeCol 
FROM T 
WHERE T.Col1 = (some condition) 

бы я benifit в производительности, если я сделал CROSS APPLY когда я ограничиваю строки в таблице А, когда я WHERE A.SomeCondition = T.SomeCondition. Эта таблица будет иметь значительно больше строк, чем другие таблицы.

+1

Избавление от 'select *' из 4 таблиц поможет в производительности. –

+0

Да, но это не вопрос. –

+1

Выполняется ли это? Как вы накладываете 'Select *' на один столбец 'SomeCol'? – Brad

ответ

1

Этот код возвращает данные, даже если таблица E не соответствует.

Вместо

LEFT JOIN E ON 
    (B.SomeID = E.SomeID) 
    OR 
    (C.SomeID = E.SomeID) 
    OR 
    (D.SomeID = E.SomeID) 

Вы можете попробовать:

INNER JOIN E on e.id = coalesce(B.SomeID, C.SomeID, D.SomeID) 

Затем начните смотреть на план запроса и посмотреть, что он показывает для ваших данных.

Смежные вопросы