2013-05-17 3 views
0

В запросеКак совместить этот запрос

cr is customers, chh? ISE customer_pays, cari_kod является код клиента, cari_unvan1 этого имя клиента cha_tarihi является дата оплаты, cha_meblag этим количество

Цели запроса оплаты, то получат specisified списка клиентов и их последнюю дату оплаты и сумму денег ...

На самом деле моему менеджеру нужны детали, но запрос очень медленный, и именно поэтому im использует только 3 подзапроса.

Вопрос в том, как их объединить?

Я исследовал о CTE и «с пунктом» и «подзапроса в„где“, но без везения.

Может кто-нибудь есть предложение.

Операционная система win2003 и версия SQL сервер MSSQL 2005 .

С уважением


select cr.cari_kod,cr.cari_unvan1, cr.cari_temsilci_kodu, 
(select top 1 
    chh1.cha_tarihi 
    from dbo.CARI_HESAP_HAREKETLERI chh1 where chh1.cha_kod=cr.cari_kod order by chh1.cha_RECno) as sontar, 
(select top 1 
    chh2.cha_meblag 
    from dbo.CARI_HESAP_HAREKETLERI chh2 where chh2.cha_kod=cr.cari_kod order by chh2.cha_RECno) as sontutar 

from dbo.CARI_HESAPLAR cr 
where (select top 1 
    chh3.cha_tarihi 
    from dbo.CARI_HESAP_HAREKETLERI chh3 where chh3.cha_kod=cr.cari_kod order by chh3.cha_RECno) >'20130314' 
and 
cr.cari_bolge_kodu='322' 
or 
cr.cari_bolge_kodu='324' 
order by cr.cari_kod 
+0

Уважаемый парадо, как я могу добавить теги кода/кода, так как я не могу это сделать. Спасибо за редактирование. – ikutluay

ответ

1

Вы вЕРОЯТНОСТЕЙ LY ускорить запрос, изменив свою последнюю where статьи в:

where (select top 1 chh3.cha_tarihi 
     from dbo.CARI_HESAP_HAREKETLERI chh3 where chh3.cha_kod=cr.cari_kod 
     order by chh3.cha_RECno 
    ) >'20130314' and 
     cr.cari_bolge_kodu in ('322', '324') 
order by cr.cari_kod 

Предполагая, что вы хотите, и условие даты встретились и один из двух кодов. Исходной логикой является (дата и код = 322) ИЛИ (код = 324).

Общий запрос можно улучшить, найдя запись в таблице chh, а затем просто используя это. Для этого вы хотите использовать функцию окна row_number(). Я думаю, что это нужный запрос:

select cari_kod, cari_unvan1, cari_temsilci_kodu, 
     cha_tarihi, cha_meblag 
from (select cr.*, chh.*, 
      ROW_NUMBER() over (partition by chh.cha_kod order by chh.cha_recno) as seqnum 
     from dbo.CARI_HESAPLAR cr join 
      dbo.CARI_HESAP_HAREKETLERI chh 
      on chh.cha_kod=cr.cari_kod 
     where cr.cari_bolge_kodu in ('322', '324') 
    ) t 
where chh3.cha_tarihi > '20130314' and seqnum = 1 
order by cr.cari_kod; 

Эта версия предполагает пересмотренную логическую логику даты/кода.

Внутренний выбор подзапроса может вызвать ошибку, если в обеих таблицах есть два столбца с одинаковым именем. Если да, то просто перечислите столбцы, а не используйте *.

+0

Дорогой Гордон Тхакс за ответ. Но этот запрос возвращает более одной детали для каждой записи. Мне нужно только последнее. – ikutluay

+0

@ikutluay. , , Это потому, что я столкнулся со всей проблемой идентификации, которая является последней, но не добавила ее в предложение where. Это фиксируется с помощью 'и seqnum = 1'. –

+0

Дорогой Гордон, когда я проверяю таблицу результатов, я вижу, что возвращенная таблица содержит не последнюю для даты. Спасибо за ваше время, но возвращаемые значения таблицы неверны – ikutluay