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

Откуда:
Сообщений: 19
Приветствую! Помогите оптимизировать запрос, для того чтобы создать его аналог в LINQ. Секцию после union можно пропустить, смысл запроса в том что есть каталог с XML файлами в которых есть данные за сутки, уникальность данных определяется атрибутами в полях XML файла, а именно inn, inn2, data. Файлы могут иметь одинаковые данные но иметь разные имена, задача состоит в том чтобы загрузить из этих файлов в базу уникальные данные, то есть проверить все файлы в каталоге на предмет того чтобы не было двух файлов с одинаковыми атрибутами inn, inn2, data.


declare @t table (
id int, 
inn int,
inn2 int,
filename varchar(30),
date datetime
)

insert into @t
select '1' as id, '111' as inn, '222' as inn2, 'abcd' as filename, '2011.01.01' as date
union
select '2' as id, '111' as inn, '222' as inn2, 'abcde' as filename, '2011.01.01' as date
union 
select '3' as id, '111' as inn, '222' as inn2, 'abcdeg' as filename, '2011.01.02' as date
union 
select '4' as id, '111' as inn, '222' as inn2, 'abcdeg1' as filename, '2011.01.03' as date
union
select '5' as id, '333' as inn, '4444' as inn2, 'dddbcdeg1' as filename, '2011.01.01' as date
union 
select '6' as id, '333' as inn, '4444' as inn2, 'fdddbcdeg1' as filename, '2011.01.02' as date
union 
select '7' as id, '333' as inn, '4444' as inn2, 'fdddbcdeg2' as filename, '2011.01.02' as date
union 
select '8' as id, '333' as inn, '4444' as inn2, 'fdddbcdeg1' as filename, '2011.01.03' as date
union 
select '9' as id, '333' as inn, '4444' as inn2, 'fdddbcdeg2' as filename, '2011.01.03' as date


select *  from @t t
where date = (select date from @t t1 
where t.inn=t1.inn and t.inn2=t1.inn2 and t.date=t1.date
group by date, inn, inn2 having count(date)>1 )
and id = (select min(id) from @t tt where  t.date=tt.date and t.inn=tt.inn and t.inn2=tt.inn2)
union
select * from @t t 
where date = (select date from @t t1
where t.inn=t1.inn and t.inn2=t1.inn2 and t.date=t1.date
group by date, inn, inn2 having count(date)=1 )
13 дек 12, 05:39    [13623263]     Ответить | Цитировать Сообщить модератору
 Re: Помогите оптимизировать запрос  [new]
Knyazev Alexey
Member

Откуда: Екб -> Мск
Сообщений: 10234
Блог
select top 1 with ties * from @t 
order by row_number() over ( partition by inn, inn2, date order by id )
13 дек 12, 06:19    [13623277]     Ответить | Цитировать Сообщить модератору
 Re: Помогите оптимизировать запрос  [new]
csharp-noob
Member

Откуда:
Сообщений: 19
Knyazev Alexey,

Спасибо большое! Работает! Для себя выводы сделал, учить, учить и еще раз учить мат часть!
13 дек 12, 07:13    [13623310]     Ответить | Цитировать Сообщить модератору
 Re: Помогите оптимизировать запрос  [new]
Exproment
Member

Откуда:
Сообщений: 416
когда узнаешь, что в клаузере order by можно использовать over partition by, жизнь становится намного проще )))
13 дек 12, 07:40    [13623329]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить