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后记录数会变多
时间: 2024-04-22 20:22:33 浏览: 77
左连接(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
以下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 查询会出现重复结果是因为它使用了三个相同的子查询,这些子查询会重复计算相同的数据,从而导致结果集中出现重复的数据。
具体来说,在主查询中,表 a 包含了所有的 DEAL_PROV_NAME,而表 b 和表 c 则分别与表 a 进行了左连接。如果某个 DEAL_PROV_NAME 在表 a 中出现了多次,那么在左连接时,它也会出现多次,从而导致结果集中出现重复的数据。
要解决这个问题,可以将子查询计算的结果存储在临时表中,然后在主查询中引用这些临时表,这样就可以避免重复计算相同的数据,从而避免结果集中出现重复的数据。
阅读全文