首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何引用和重用相关子查询?

如何引用和重用相关子查询?
EN

Stack Overflow用户
提问于 2013-05-15 00:39:27
回答 2查看 94关注 0票数 1

假设一个贸易表和一个通过交易id连接的cds_coupon表;优惠券表也有结算日期和结算金额。所需的查询是获取下一张要结算的息票的金额和日期。

代码语言:javascript
复制
    select t.tradeId AS tradeId,
(
  select settlement_date from cds_coupon e 
  where t.tradeId=e.tradeId 
  and e.settlement_date = (select min(settlement_date) from cds_coupon ei where ei.tradeId = t.tradeId  and ei.settlement_date > sysdate )
)  AS settlement_date,
( 
  select settlement_amount from cds_coupon e 
  where t.tradeId=e.tradeId 
  and e.settlement_date = (select min(settlement_date) from cds_coupon ei where ei.tradeId = t.tradeId and ei.settlement_date > sysdate )
)  AS settlement_amount, 
   FROM Trade t

可以看出,两个级别的相同相关性被执行两次,只是为了获取不同的字段-一次用于获取结算日期,另一次用于获取结算金额。因此出现了一个问题--如何引用和重用相关的子查询?

EN

回答 2

Stack Overflow用户

发布于 2013-05-15 00:42:01

如果使用SQL Server,则可以使用Common Table Expression (CTE)

代码语言:javascript
复制
;WITH SettlementDates ()
AS
(
    SELECT tradeId, MIN(settlement_date) as settlement_date
    FROM cds_coupon  
    WHERE settlement_date > sysdate
    GROUP BY tradeId
)

SELECT e.trade_id, e.settlement_date, e.settlement_amount
FROM cds_coupon e
JOIN SettlementDates sd 
    ON (e.trade_id = sd.trade_id)
   AND (e.settlement_date = sd.settlement_date)
票数 0
EN

Stack Overflow用户

发布于 2013-05-15 00:53:55

使用联接而不是相关子查询:

代码语言:javascript
复制
select t.tradeId, e.settlement_date, e.settlement_amount
from Trade t
join (select ei.tradeId, ei.settlement_date, ei.settlement_amount
      from cds_coupon ei
      join (select tradeId, min(settlement_date) min_date
            from cds_coupon
            where settlement_date > sysdate
            group by tradeId) emin
      on ei.tradeId = e.tradeId and ei.settlement_date = min_date) e
on t.tradeId = e.tradeId

子查询是一种标准用法,用于查找包含最小或最大字段值的行。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16548489

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档