Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 упростить вложенные селекты  [new]
ivan.555-19
Member

Откуда:
Сообщений: 11
всем привет!
написал такую штуку:
create table t1 (name char(20), id int);
insert into t1 values ('aaa', 1);
insert into t1 values ('aaa', 2);
insert into t1 values ('aaa', 3);
insert into t1 values ('bb', 4);
insert into t1 values ('bb', 5);
insert into t1 values ('ccc', 6);
insert into t1 values ('dddd', 7);

create table t2 (id int);
insert into t2 values (3);
insert into t2 values (6);

select * 
from t1 
where t1.name in(
    select t1.name 
    from t1
    where t1.id in (
        select t1.id
        from t1
        inner join t2 on t2.id = t1.id
    )
);

но, она работает, по ощущениям, медленнее, чем могла бы..
не скажете, можно ли было бы аналогичный результат получить более оптимальным способом?
(думаю, мне кажется, можно одним селектом получить аналогичный результат, но пока не вижу как)
5 июн 19, 10:40    [21902224]     Ответить | Цитировать Сообщить модератору
 Re: упростить вложенные селекты  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 36694
select * 
from t1 
where exists ( select * from t2 where t1.id = t2.id  )
5 июн 19, 10:49    [21902234]     Ответить | Цитировать Сообщить модератору
 Re: упростить вложенные селекты  [new]
Щукина Анна
Member

Откуда:
Сообщений: 1466
Гавриленко Сергей Алексеевич,

результат же будет неэквивалентен исходному...
5 июн 19, 10:55    [21902246]     Ответить | Цитировать Сообщить модератору
 Re: упростить вложенные селекты  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 20205
select t1_1.*
from t1 t1_1
join t1 t1_2 on t1_1.name = t1_2.name
join t2 on t1_2.id = t2.id
5 июн 19, 11:00    [21902256]     Ответить | Цитировать Сообщить модератору
 Re: упростить вложенные селекты  [new]
Щукина Анна
Member

Откуда:
Сообщений: 1466
ivan.555-19,

Выкиньте один уровень вложенности:
select * 
  from t1 
 where t1.name in (
                    select t1.name
                      from t1
                      join t2 
                        on t2.id = t1.id
                  )


Или всё тоже самое, но на EXISTS:
select * 
  from t1 
 where exists (
                select null
                  from t1 t11
                  join t2 
                    on t2.id = t11.id
                   and t11.name = t1.name
              )
5 июн 19, 11:01    [21902259]     Ответить | Цитировать Сообщить модератору
 Re: упростить вложенные селекты  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 20205
with cte as (
select t1.*, count(t2.id) over (partition by t1.name) cnt
from t1
left join t2 on t1.id = t2.id
)
select name, id 
from cte 
where cnt > 0
5 июн 19, 11:03    [21902262]     Ответить | Цитировать Сообщить модератору
 Re: упростить вложенные селекты  [new]
ivan.555-19
Member

Откуда:
Сообщений: 11
Гавриленко Сергей Алексеевич,
Щукина Анна,
Akina,

Всем спасибо большое, перебрал все варианты, на моих данных сделал пока так:

Akina
select t1_1.*
from t1 t1_1
join t1 t1_2 on t1_1.name = t1_2.name
join t2 on t1_2.id = t2.id
5 июн 19, 12:05    [21902366]     Ответить | Цитировать Сообщить модератору
 Re: упростить вложенные селекты  [new]
Ролг Хупин
Member

Откуда: Чебаркуль
Сообщений: 3462
ivan.555-19
Гавриленко Сергей Алексеевич,
Щукина Анна,
Akina,

Всем спасибо большое, перебрал все варианты, на моих данных сделал пока так:

Akina
select t1_1.*
from t1 t1_1
join t1 t1_2 on t1_1.name = t1_2.name
join t2 on t1_2.id = t2.id


т.е. вы уверены, что с NULL-ми при таком подходе всё будет хорошо?
5 июн 19, 12:14    [21902384]     Ответить | Цитировать Сообщить модератору
 Re: упростить вложенные селекты  [new]
iap
Member

Откуда: Москва
Сообщений: 46953
Ролг Хупин
ivan.555-19
Гавриленко Сергей Алексеевич,
Щукина Анна,
Akina,

Всем спасибо большое, перебрал все варианты, на моих данных сделал пока так:

пропущено...


т.е. вы уверены, что с NULL-ми при таком подходе всё будет хорошо?
А name в разных строках хранится в абсолютно одинаковом виде, без ошибок и без лишних пробелов...
5 июн 19, 12:39    [21902413]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить