Надо сделать запрос:
На входе у него список строк,
На выходе должно быть не более чем по одному id на каждую входную строку (по полю attrib).
Проблема в том, что attrib не является уникальным полем.
В случае, если attrib встречается в нескольких записях, можно выбрать любую.
Очевидное решение выглядит так:
select max(id)
from table1
where attrib in (<list>)
group by attrib
Проблема в том, что агрегаты не принимают uniqueidentifier.
D>Надо сделать запрос: D> На входе у него список строк, D> На выходе должно быть не более чем по одному id на каждую входную строку (по полю attrib). D>Проблема в том, что attrib не является уникальным полем. D>В случае, если attrib встречается в нескольких записях, можно выбрать любую.
я наверно не совсем понял, что требуется, distinct точно не подойдет?
Здравствуйте, DuШes, Вы писали:
DШ>Здравствуйте, diamondio, Вы писали:
D>>Здравствуйте!
D>>Не первый раз сталкиваюсь со следующей проблемой.
D>>В MSSQL БД имеется таблица из 2 полей: D>>
D>>Надо сделать запрос: D>> На входе у него список строк, D>> На выходе должно быть не более чем по одному id на каждую входную строку (по полю attrib). D>>Проблема в том, что attrib не является уникальным полем. D>>В случае, если attrib встречается в нескольких записях, можно выбрать любую.
DШ>я наверно не совсем понял, что требуется, distinct точно не подойдет?
Distinct не подойдет. Они (id) и так все разные, т.к. PK. Надо выбрать один из нескольких id, которые образуются при группировке по attrib.
без промежуточной таблицы с нормальным identity полем наверно и не получится, хотя наверно и можно....навскидку такой вариант
create table #test ( id uniqueidentifier default (newid()),
attrib varchar(100)
)
create table #ids( id uniqueidentifier default (newid()),
attrib varchar(100),
min_id int identity(1, 1)
)
insert into #test (attrib)
values ('value_01')
insert into #test (attrib)
values ('value_01')
insert into #test (attrib)
values ('value_02')
insert into #test (attrib)
values ('value_03')
insert into #test (attrib)
values ('value_03')
insert into #ids
select *
from #test
select *
from #test T
select *
from #ids T
where min_id in (select min(min_id) from #ids group by attrib)
Здравствуйте, DuШes, Вы писали:
DШ>Здравствуйте, diamondio, Вы писали:
DШ>[....]
DШ>без промежуточной таблицы с нормальным identity полем наверно и не получится, хотя наверно и можно....навскидку такой вариант
подумал, можно и без промежуточной, все проще:
select distinct attrib,
(select top 1 id from #test T2 where T2.attrib = T1.attrib)
from #test T1
Здравствуйте, diamondio, Вы писали:
D>Здравствуйте, diamondio, Вы писали:
D>>Здравствуйте, DuШes, Вы писали:
DШ>>>подумал, можно и без промежуточной, все проще:
DШ>>>
DШ>>> select distinct attrib,
DШ>>> (select top 1 id from #test T2 where T2.attrib = T1.attrib)
DШ>>> from #test T1
DШ>>>
D>>Спасибо, то что нужно!
D>Кстати, первый вариант раза в 2 быстрее будет.
планы несмотрел, вообще все зависит от количества записей в выборке, от наличия необходимых индексов и прочее...создание промежуточной временной таблицы тоже не есть самый хороший вариант
Здравствуйте, diamondio, Вы писали:
D>Кстати, первый вариант раза в 2 быстрее будет.
С промежуточной таблицей? Не смеши меня, посмотри планы запросов. SQL server умеет оптимизировать вложенные top 1 с версии как минимум 2000, а то и старше.
... << RSDN@Home 1.2.0 alpha rev. 677>>
Уйдемте отсюда, Румата! У вас слишком богатые погреба.