Переделать NOT EXISTS на EXISTS

xandr_ukr

Добрый день Есть вот такая валидацияIF NOT EXIST (SELECT 'x' FROM TABLE1 INNER JOIN TABLE2 ON TABLE1.TABLE2_ID = TABLE2_ID INNER JOIN #TempTable TMP ON TMP.ID = TABLE1.TABLE2_AAA_ID WHERE TABLE1.BBB_ID = 0 AND TABLE1.CCC_ID = 0 AND TABLE2.AAA_ID = 0)Можно ли переделать это но только используя EXISTS (не NOT EXISTS) ?MS SQL2005Заранее спасибо
14 ответов

xandr_ukr

IF EXIST(SELECT 'x' FROM TABLE1INNER JOIN TABLE2 ON TABLE1.TABLE2_ID = TABLE2_IDINNER JOIN #TempTable TMP ON TMP.ID = TABLE1.TABLE2_AAA_IDWHERE NOT(TABLE1.BBB_ID = 0AND TABLE1.CCC_ID = 0AND TABLE2.AAA_ID = 0))


xandr_ukr

ну гдето NOT все равно надо ведь?для спящего время бодрствования равносильно сну


xandr_ukr

но только используя EXISTS (не NOT EXISTS) ?
Это для работы надо или на собеседовании вопрос задали?


xandr_ukr

Паганель,Та для работы. Столкнулся с тем что по перфомансу NOT EXISTS не особо хорошо


xandr_ukr

xandr_ukr,а EXISTS типа лучше?


xandr_ukr

ну гдето NOT все равно надо ведь?для спящего время бодрствования равносильно сну
Да нет. Есть вариант в связке исользовать IS NULL


xandr_ukr

Паганель,Та для работы. Столкнулся с тем что по перфомансу NOT EXISTS не особо хорошо


xandr_ukr

ищите затык в другом месте, а не в NOT EXISTS =)для спящего время бодрствования равносильно сну


xandr_ukr

ищите затык в другом месте, а не в NOT EXISTS =)для спящего время бодрствования равносильно сну
Сарказм уместен, но .....Есть вариант использовать EXIST + LEFT JOIN + TABLE2_AAA_ID IS NULL. Но слегонца я уже сломал голову. )))


xandr_ukr

IF EXISTS
(
 SELECT T1.TABLE2_ID,T1.TABLE2_AAA_ID,<b>0</b>,<b>0</b>,<b>0</b>
 FROM TABLE1 T1
 INNER JOIN TABLE2 ON T1.TABLE2_ID = TABLE2_ID
 INNER JOIN #TempTable TMP ON TMP.ID = T1.TABLE2_AAA_ID
 EXCEPT
 SELECT TABLE1.TABLE2_ID,TABLE1.TABLE2_AAA_ID,TABLE1.BBB_ID,TABLE1.CCC_ID,TABLE2.AAA_ID
 FROM TABLE1
 INNER JOIN TABLE2 ON TABLE1.TABLE2_ID = TABLE2_ID
 INNER JOIN #TempTable TMP ON TMP.ID = TABLE1.TABLE2_AAA_ID
);
???


xandr_ukr

Задача дурная, раз для работы. Используйте NOT EXISTS, и не парьтесь!


xandr_ukr

Столкнулся с тем что по перфомансу NOT EXISTS не особо хорошо
То есть Вы ожидали, что будет использоваться какой-то индекс,но он почему-то не используется, я правильно понимаю?


xandr_ukr

Сарказм уместен, но .....Есть вариант использовать EXIST + LEFT JOIN + TABLE2_AAA_ID IS NULL. Но слегонца я уже сломал голову. )))
вы план выполнения то анализировали? чтобы вот так вот говорить NOT EXISTS не особо хорошо..


xandr_ukr

если уникальности позволяют - действительно на LEFT JOIN + NULL попробовать, возможно лучче будет за счет более вероятного ухода от LOOP