C>что-то запутался...
Готов убить самого себя за такой запрос...
С другой стороны, если исходная таблица маленькая и обращений к ней немного, то можно и оставить как есть.
select * into #t from (
select 1 as v
union all select 2
union all select 3
union all select 3
union all select 4
union all select 4
union all select 4
union all select 5
union all select 6
union all select 3
union all select 7
union all select 8
union all select 9
union all select 2
) t
select * from #t where v in
(
select v from (
select v, count(v) as cnt from #t group by v having count(v) > 1
) tt
)
order by v
drop table #t
C>почему? а за второй вариант, тоже готов убить себя?
В первом варианте в подзапросе лишняя колонка ("хвост" от неудачного варианта).
Запрос неоптимальный. Это видно из плана запроса (у меня два Table Scan по одной таблице).
Т.е. если исходная таблица будет большой, то такой запрос может работать неприемлемо долго.
Но как наглядный пример пошагового решения задачи он как раз подходит.
Здравствуйте, Снег, Вы писали:
С>Запрос неоптимальный. Это видно из плана запроса (у меня два Table Scan по одной таблице). С>Т.е. если исходная таблица будет большой, то такой запрос может работать неприемлемо долго.
О сколько нам открытий чудных...
Если таблица будет большой, вполне возможно у запроса изменится план.
На малой табличке зачастую Table Scan выгоднее, чем Index Seek.