SQL Сервер ВСЕ подзапрос без строк, как заставить false? - PullRequest
1 голос
/ 05 августа 2020

Мне нужен синтаксис, который обеспечил бы мне производительность ВСЕГО, исключая родительские строки без дочерних (неудачный подзапрос). как и ожидалось

Второй запрос возвращает один и три (согласно SQL стандарту). Третий запрос возвращает один, желаемый результат.

Когда я использовать ALL и EXISTS вместе (третий запрос) в моем большом наборе данных, запрос идет от миллисекунд до 60 секунд. Есть ли способ изменить синтаксис ALL так, чтобы в неудачном подзапросе для «Test Three» выдавалось false?

Этот связанный вопрос помог мне понять, почему второй запрос дает результаты, отличные от моих ожиданий: * ВСЕ против ЛЮБЫХ

1 Ответ

1 голос
/ 12 августа 2020

Вы можете преобразовать ALL в NOT EXISTS.

Вместо того, чтобы говорить:

все связанные записи должны иметь четвертый символ 'P'

Можно сказать:

никакие связанные записи не могут иметь ничего, кроме 'P' в качестве 4-го символа

Результат реализации ниже соответствует выходу вашего третьего (желаемого) результата запроса. Проверка производительности намного сложнее с вашим полным набором данных.

select *
from #Parts p
where exists (  select 'x'
                from #Attr a
                where a.Part = p.Part)
  and not exists (  select 'x'
                    from #Attr a
                    where a.Part = p.Part
                      and substring(a.Attr, 4, 1) <> 'P' )
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...