【SQL】表关联数据发散问题

关于表关联数据发散问题

   SELECT 
	      A.NO,
	      A.NAME,
	      B.NAME,
	      C.NAME
	 FROM A_DEMO A_DEMO
LEFT JOIN B_DEMO B
       ON A.NO = B.NO	
LEFT JOIN C_DEMO C
       ON A.NO = C.NO

1、检查主表A是否自身带有重复数据
2、检查B、表C表是否带有重复数据

解决方法

1、对关联条件进行检查

(1)应做到一对一的关系,一对多的关系会导致数据发散
(2)增加过滤条件

2、对重复数据的表去重处理

(1)GROUP BY
(2)DISTINCT
(3)做子查询进行分组排序取1条数据

3、对表进行预处理

提前把可能会出现重复数据的表进行去重
【Oracle】关于去重问题

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在Oracle数据库中,关联操作可能会导致数据发散,主要原因是一对多的关联关系。例如,假设有两个T1和T2,它们之间存在一对多的关联关系,即T1中的每一条记录都可能对应T2中的多条记录。如果对T1和T2进行关联操作,那么就会出现多条T1记录与多条T2记录匹配的情况,导致数据发散。 举个例子,假设有两个Order和OrderDetail,Order记录了订单的基本信息,而OrderDetail记录了订单的详细信息,包括订单中每个商品的数量和价格等。这两个之间的关联关系是一对多的,即一个订单可能包含多个商品。如果要查询某个日期范围内的订单及其商品信息,可以使用以下SQL语句: ``` SELECT * FROM Order o JOIN OrderDetail od ON o.order_id = od.order_id WHERE o.order_date BETWEEN '2021-01-01' AND '2021-01-31'; ``` 这条SQL语句将Order和OrderDetail关联起来,查询出了所有在2021年1月份下单的订单及其商品信息。但是,由于一个订单可能包含多个商品,因此查询结果中会出现多条相同的订单记录,这就是数据发散现。为了避免数据发散,可以使用分组聚合操作将结果合并: ``` SELECT o.order_id, o.order_date, SUM(od.quantity*od.price) AS total_amount FROM Order o JOIN OrderDetail od ON o.order_id = od.order_id WHERE o.order_date BETWEEN '2021-01-01' AND '2021-01-31' GROUP BY o.order_id, o.order_date; ``` 这条SQL语句将查询结果按照订单ID和订单日期进行分组,并计算出每个订单的总金额。这样就避免了数据发散问题
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值