2016-11-06 1 views
3

Я пытаюсь понять логику простой запрос:SQL - используя ту же таблицу во внешнем запросе и в суб-запроса

select * 
from table1 as t1 cross join table2 as t2 
where t2.source_code = (
    select Max(t3.source_code) 
    from table2 t3 
    where t3.source_code in (t1.code_value) 
    ) 

Я прочитал о вложенных запросах, также IV» Я искал родственный вопрос как мой, я не нашел четкого ответа.

Мой вопрос: как я могу знать сложность этого запроса (сколько раз выполняется подзапрос).

Я не совсем уверен, как работает подзапрос, поскольку я использую таблицу из внешнего запроса внутри подзапроса.

+1

Никогда не будет окончательного ответа, когда дело доходит до производительности. Это может варьироваться в зависимости от ваших индексов, размеров таблиц ETC. Запустите план выполнения. – sagi

ответ

3

Это (Грозный, Horrible, No Good, Very Bad) запрос не эквивалентно:

select * from table1 as t1 join table2 as t2 on t1.code_value = t2.source_code; 

Если отношение между таблицами составляет 1: 1 или 1: N, то теоретическая сложность O (п) ,
Фактическая сложность - это структура базы данных/данных/статистика.

+0

Правильно! Поскольку это не сразу видно, может быть, хорошо подчеркнуть, что max() абсолютно бесполезен в исходном запросе, так как «source_code» в подзапросе имеет одно значение, которое определяется «t3.source_code in (t1 .code_value) 'условие – Insac

+0

@Insac, но тогда весь подзапрос бесполезен ... :-) Я действительно, действительно надеюсь, что это не реальный код. –

+0

Я разделяю вашу надежду :-) – Insac