0

在查询中

cr是客户,chh?ise customer_pays,cari_kod 是客户代码,cari_unvan1 是客户名称 cha_tarihi 是付款日期,cha_meblag 是付款金额

查询的目的,获取指定的客户列表及其最后付款日期和金额...

实际上,我的经理需要更多详细信息,但查询速度很慢,这就是我只使用 3 个子查询的原因。

问题是如何将它们结合起来?

我研究过 Cte 和“with 子句”和“where”中的子查询,但没有运气。

任何人都可以有一个建议。

操作系统是win2003,sql server版本是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

假设您希望满足日期条件和两个代码之一。您的原始逻辑是(日期和代码 = 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;

此版本采用修改后的逻辑日期/代码逻辑。

如果两个表中有两个同名的列,则内部子查询 select 可能会生成错误。如果是这样,那么只需列出列而不是使用*.

于 2013-05-17T13:22:40.450 回答