【问题标题】:How to combine this query如何组合此查询
【发布时间】:2013-05-17 13:07:06
【问题描述】:

在查询中

cr 是客户, ch?是客户付款, 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

【问题讨论】:

  • 亲爱的帕拉多,我怎么能添加代码/代码标签,因为我不能这样做。感谢编辑。

标签: sql sql-server-2005 subquery master-detail sql-subselect


【解决方案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

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

此版本假定修改后的逻辑日期/代码逻辑。

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

【讨论】:

  • 尊敬的 Gordon 谢谢您的回复。但是此查询为每条记录返回多个详细信息。我只需要最后一个。
  • @ikutluay 。 . .那是因为我经历了所有的麻烦来确定哪个是最后一个,但没有将它添加到 where 子句中。这已通过and seqnum = 1 修复。
  • 亲爱的 Gordon,当我检查结果表时,我发现返回的表不包含该日期的最新表。感谢您的宝贵时间,但返回的表值不正确
  • @ikutluay 。 . .它应该包含第一个,就像在您的原始查询中一样。两者都按升序排列记录并取第一个。如果你想要最后一个,那么排序应该按降序排列。
  • 我只是这样做,并为经理添加必要的列,它正在工作
猜你喜欢
  • 2014-01-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多