0

クエリで

cr はお客様ですか、chh ですか。ise customer_pays、cari_kod は顧客コード、cari_unvan1 は顧客名 cha_tarihi は支払日、cha_meblag は支払金額

クエリの目的は、指定された顧客のリストと、支払いの最終日と金額を取得することです...

実際、私のマネージャーは詳細を必要としていますが、クエリが非常に遅いため、サブクエリを 3 つしか使用していません。

問題は、それらをどのように組み合わせるかです。

私はCteと「with句」と「「where」のサブクエリについて調査しましたが、運がありませんでした。

誰でも提案できますか。

オペレーティング システムは 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
4

1 に答える 1

1

最後の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

日付条件が満たされ、2 つのコードのいずれかが必要であると仮定します。元のロジックは (日付とコード = 322) OR (コード = 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;

このバージョンは、改訂されたロジック日付/コード ロジックを前提としています。

両方のテーブルに同じ名前の列が 2 つある場合、内部サブクエリの選択でエラーが発生する可能性があります。その場合は、を使用する代わりに列をリストするだけ*です。

于 2013-05-17T13:22:40.450 に答える