SELECT t1.user_type ,t1.注册year_ ,t1.region_name ,t1.final_prov_name ,t1.final_city_name ,t1.注册时间 ,t1.user_id ,t1.gmv ,t1.结算单量 ,t2.enterprise_id ,t2.order_goods_lv1_name ,t2.order_business_line_type FROM wanshifu_sas.user_reg_address_20230607_cy t1 LEFT join wanshifu_dw.dws_order_d t2 on CAST(t1.user_id AS VARCHAR(20)) = t2.user_id WHERE stat_date >= '20150101' AND stat_date <= '20221231';为什么t1左连接t2后gmv的值会变多
时间: 2024-04-22 20:22:40 浏览: 60
左连接(left join)是指以左表(t1)为基础,将其全部记录都保留,并与右表(t2)进行匹配,如果右表中有匹配的记录,则将其加入结果集,如果右表中没有匹配的记录,则将其补NULL值。因此,左连接后的记录数不会减少,反而可能会增加,这些新增的记录可能会导致gmv的值变多。具体而言,如果左表中的一条记录在右表中有多条匹配记录,则左连接后该条记录会在结果集中出现多次,相应的gmv的值也会增加。
相关问题
SELECT t1.user_type ,t1.注册year_ ,t1.region_name ,t1.final_prov_name ,t1.final_city_name ,t1.注册时间 ,t1.user_id ,t1.gmv ,t1.结算单量 ,t2.enterprise_id ,t2.order_goods_lv1_name ,t2.order_business_line_type FROM wanshifu_sas.user_reg_address_20230607_cy t1 LEFT join wanshifu_dw.dws_order_d t2 on CAST(t1.user_id AS VARCHAR(20)) = t2.user_id WHERE stat_date >= '20150101' AND stat_date <= '20221231';为什么t1左连接t2后记录数会变多
左连接(left join)是指以左表(t1)为基础,将其全部记录都保留,并与右表(t2)进行匹配,如果右表中有匹配的记录,则将其加入结果集,如果右表中没有匹配的记录,则将其补NULL值。因此,左连接后的记录数不会减少,反而可能会增加,因为左表中可能存在没有匹配到右表的记录,这些记录也会被保留在结果集中。
修改以下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
这个 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
阅读全文