如何将 4 个 sql 查询组合成一个性能良好的查询?

Posted

技术标签:

【中文标题】如何将 4 个 sql 查询组合成一个性能良好的查询?【英文标题】:How to combine 4 sql queries into a single query with good performance? 【发布时间】:2021-08-27 01:05:38 【问题描述】:

我有一个问题要解决。首先,我将这个问题分成几部分,因此我分别编写了四个查询,但现在我需要将它们放在一起,就好像它是一个返回单个结果的单个调用一样。我该怎么做?

1)我根据分店选择购买

SELECT CD_PURCHASE FROM TB_PURCHASE_STORE WHERE CD_BRANCH = ? AND CD_STORE = ?

2) 我验证购买的促销期是否在当前日期(今天)内

SELECT CD_PURCHASE, DT_BEGIN_PROMOTION, DT_END_PROMOTION FROM TB_PURCHASE 
WHERE SYSDATE BETWEEN TO_DATE(DT_BEGIN_PROMOTION) AND TO_DATE(DT_END_PROMOTION)
   

3) 从购买代码中,我检查哪些产品是有效的

SELECT CD_PURCHASE, CD_PRODUCT FROM TB_PURCHASE_PRODUCT WHERE FL_ACTIVE = 1

4) 最后我根据客户id返回一些字段

SELECT CD_PURCHASE, CD_PRODUCT, ID_CUSTOMER, DT_LAST_PURCHASE 
FROM TB_PURCHASE_SALES WHERE ID_CUSTOMER = ?

【问题讨论】:

样本数据、期望的结果以及对您想要做什么的清晰解释都会有所帮助。 @GordonLinoff 我想做一个查询,提供一个记录列表,其中包括:购买代码、产品代码、客户 ID 和上次购买日期。要返回这个数据,我需要考虑一些事情:只购买分店和商店发布的购买(第一步),只购买促销期范围在当前日期内的购买(第二步),只购买有活动产品的购买(第三步),仅由到达申请的客户进行的购买(第四步) 【参考方案1】:

您是否尝试过以下查询?我假设你想要所有表的 INNER JOIN,CD_PURCHASE 是所有表中的公共链接,CD_PRODUCT 是 TB_PURCHASE_PRODUCT 和 TB_PURCHASE_SALES 之间的链接。

SELECT TPS.CD_PURCHASE,
TP.CD_PURCHASE, TP.DT_BEGIN_PROMOTION, TP.DT_END_PROMOTION, 
TPP.CD_PURCHASE, TPP.CD_PRODUCT,
TPSS.CD_PURCHASE, TPSS.CD_PRODUCT, TPSS.ID_CUSTOMER, TPSS.DT_LAST_PURCHASE
FROM TB_PURCHASE_STORE TPS, 
TB_PURCHASE TP, 
TB_PURCHASE_PRODUCT TPP,
TB_PURCHASE_SALES TPSS
WHERE TPS.CD_BRANCH = ? AND TPS.CD_STORE = ?
AND TPS.CD_PURCHASE = TP.CD_PURCHASE
AND SYSDATE BETWEEN TO_DATE(TP.DT_BEGIN_PROMOTION) AND TO_DATE(TP.DT_END_PROMOTION)
AND TPP.CD_PURCHASE = TPS.CD_PURCHASE
AND TPP.FL_ACTIVE = 1
AND TPSS.CD_PURCHASE = TPS.CD_PURCHASE AND TPSS.CD_PRODUCT = TPP.CD_PRODUCT
AND TPSS.ID_CUSTOMER = ?

【讨论】:

以上是关于如何将 4 个 sql 查询组合成一个性能良好的查询?的主要内容,如果未能解决你的问题,请参考以下文章

将多个 SQL 查询组合成单个结果

SQL中如何将两个相同的表格组合成一个表格

如何获取两个 sql 查询并将它们组合成一个查询

将这些查询组合成一个多表连接

如何获取两个SQL查询并将它们组合成一个查询

如何将这两个查询组合成一个查询?