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

Откуда:
Сообщений: 90
Здравствуйте.
Имеем следующее :

1. Во времянку отобраны уникальные идентификаторы N записей каталога МЦ, к примеру
create table #selmc
(
rec_mc binary(8)
)
insert #selmc(rec_mc) values (cast(cast(1 as bigint)+0x8000000000000000 as BINARY(8)))
insert #selmc(rec_mc) values (cast(cast(2 as bigint)+0x8000000000000000 as BINARY(8)))
insert #selmc(rec_mc) values (cast(cast(7 as bigint)+0x8000000000000000 as BINARY(8)))
....
insert #selmc(rec_mc) values (cast(cast(100 as bigint)+0x8000000000000000 as BINARY(8)))

2. есть таблица спецификации накладных(.. несколько млн. записей) примерно со следующими ключевыми полями

table spnakl :

- vidsopr -- вид сопроводительного документа
- cmc -- ссылка на МЦ
- party -- ссылка на партию
- dsopr -- дата проведения
- kol -- кол-во
- price -- цена
- nsopr -- номер сопров документа

Хочется для каждой записи времянки выбрать последнюю по дате (dsopr) запись spnakl. Знаю как это сделать :
- с outer apply
- с курсором, по очереди отдавая в подзапрос нужный #selmc.rec_mc
- коррелированный подзапрос в полях select-list (не гуд,наверное тоже так как полей нада выбрать не одно а несколько....)

а как то можно одним select это сделать , используя join-ы (ну и еще что то навреное)

Что то вроде:
select  
    mc.name
   ,COALESCE(t1.cparty,0) as cmol  
   ,COALESCE(t1.dsopr,0) as dsopr 
   ,COALESCE(t1.nsopr,'') as nsopr 
   ,COALESCE(t1.price,0 ) 
 from #selmc selmc left join (          
                                       select top 1 sp.cparty as cparty,sp.dsopr as dsopr,sp.nsopr as nsopr,spo.srprice as srprice,sp.cmc as cmc
                                           from spnakl sp inner join order spo on sp.nrec=spo.cspnakl  sp.vidsopr=1 and sp.dsopr<>0 and sp.cparty<>0 and  spnakl.cmc=selmc.rec_mc order by sp.dsopr desc
     ) t1 on selmc.rec_mc=t1.cmc
        inner join katmc mc on selmc.rec_mc=mc.nrec


так ругается ,конечно на использование в подзапросе поля снаружи ...
3 окт 12, 09:22    [13259496]     Ответить | Цитировать Сообщить модератору
 Re: подзапрос  [new]
iap
Member

Откуда: Москва
Сообщений: 47198
bormental,

TOP(1) WITH TIES * ... ORDER BY ROW_NUMBER()OVER(PARTITION BY ... ORDER BY ...)
3 окт 12, 09:35    [13259542]     Ответить | Цитировать Сообщить модератору
 Re: подзапрос  [new]
Добрый Э - Эх
Guest
bormental
Хочется для каждой записи времянки выбрать последнюю по дате (dsopr) запись spnakl. Знаю как это сделать :
- с outer apply
- с курсором, по очереди отдавая в подзапрос нужный #selmc.rec_mc
- коррелированный подзапрос в полях select-list (не гуд,наверное тоже так как полей нада выбрать не одно а несколько....)

а как то можно одним select это сделать , используя join-ы (ну и еще что то навреное)


Вот тут собраны достаточно много способов решения поставленной тобой задачи: тынц
3 окт 12, 11:24    [13260339]     Ответить | Цитировать Сообщить модератору
 Re: подзапрос  [new]
bormental
Member

Откуда:
Сообщений: 90
Спасибо ответившим..правда варианты 2,3,4,5,6 по ссылку не подойдут для моего случая (т.к. нада вытащить несколько полей а на разрез group by при max в подзапросе по аналогии с этими примерами вытащится много всякой инфы кроме самой последней нужной....со where тоже не катит)
3 окт 12, 15:41    [13262616]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить