修改以下sql 使其符合逻辑 select a.* from (select count(order_id),DEAL_PROV_NAME from ee_order_sub_sheet where SUB_SHEET_ID in(3090, 3163, 3173, 3174, 3191, 3228, 3215) GROUP BY DEAL_PROV_NAME) a left join (select count(order_id),DEAL_PROV_NAME from ee_order_sub_sheet where SUB_SHEET_ID in(3090, 3163, 3173, 3174, 3191, 3228, 3215) GROUP BY DEAL_PROV_NAME) b on a.DEAL_PROV_NAME = b.DEAL_PROV_NAME left join (select count(order_id),DEAL_PROV_NAME from ee_order_sub_sheet where SUB_SHEET_ID in(3090, 3163, 3173, 3174, 3191, 3228, 3215) GROUP BY DEAL_PROV_NAME) c on a.DEAL_PROV_NAME = c.DEAL_PROV_NAME
时间: 2024-04-21 08:27:46 浏览: 179
在ASP.NET 2.0中操作数据之七十一:保护连接字符串及其它设置信息
这个 SQL 语句的逻辑是查询表 ee_order_sub_sheet 中 SUB_SHEET_ID 在指定值集合中的数据,根据 DEAL_PROV_NAME 分组计算每个 DEAL_PROV_NAME 对应的订单数量,然后通过左连接将结果表 a 和 b、c 进行连接。
这个 SQL 语句的问题在于,它使用了三个相同的子查询,这会造成性能浪费。可以使用 WITH 子句将子查询定义为临时表,然后在主查询中引用这些临时表,以提高查询性能。
修改后的 SQL 语句如下:
WITH temp_table AS (
SELECT COUNT(order_id) AS order_count, DEAL_PROV_NAME
FROM ee_order_sub_sheet
WHERE SUB_SHEET_ID IN (3090, 3163, 3173, 3174, 3191, 3228, 3215)
GROUP BY DEAL_PROV_NAME
)
SELECT a.*, b.order_count AS count_b, c.order_count AS count_c
FROM temp_table a
LEFT JOIN temp_table b ON a.DEAL_PROV_NAME = b.DEAL_PROV_NAME
LEFT JOIN temp_table c ON a.DEAL_PROV_NAME = c.DEAL_PROV_NAME
阅读全文