欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

多表查询中对应关系的汇总规则

程序员文章站 2022-07-23 11:13:13
多表查询中对应关系的汇总规则多表查询连接方式决定多表连接结果的三个属性对应关系一对一多对多一对多多表查询通过不同表中具有相同意义的关键字段,将多个表进行横向连接,查询不同表中的字段信息。注:连接两表时,用于连接的字段称为关键字段。连接方式内连接和外连接(左连接和右连接)决定多表连接结果的三个属性方向性:在外连接中,写在前面的表为左表,写在后面的表为右表主附关系:主表要出所有的数据范围,附表与主表无匹配项时标记为null,内连接时无主附表之分对应关系:关键字段中有重复值的表为多表,没有...

多表查询

通过不同表中具有相同意义的关键字段,将多个表进行横向连接,查询不同表中的字段信息。
:连接两表时,用于连接的字段称为关键字段。

连接方式

  • 内连接和外连接(左连接和右连接)

决定多表连接结果的三个属性

  • 方向性:在外连接中,写在前面的表为左表,写在后面的表为右表
  • 主附关系:主表要出所有的数据范围,附表与主表无匹配项时标记为null,内连接时无主附表之分
  • 对应关系:关键字段中有重复值的表为多表,没有重复值的表为一表,它决定连接后的行数是两表对应项乘积的结果

对应关系

由于关键字段中有重复值的表为多表,没有重复值的表为一表,而在一张表中主键是没有重复值的,有重复值的是非主键字段,所以一对一,多对多和一对多的三种对应关系又可分别称为:

  • 一对一:主键连主键
  • 多对多:非主键连非主键
  • 一对多:主键连非主键

一对一

一对一对应关系在实际应用中是最不可能出现的,因为主键是记录单位,表中所有的字段都是围绕主键进行的,所以当两表的主键相同时是可以放在一个表中的。如下面的两张表,当用学员ID进行连接时,是一对一的对应关系,这时两表完全可以合并成一张表。

学员ID 学员姓名 手机号码
1 赵大 13356781234
2 王二 13256781235
3 张三 13156781236
学员ID 学员性别
1
2
3

注意: 一对一的连接关系一旦出现就要检查是否合理,此时需要考虑是物理层级的一对一还是真正业务逻辑上的一对一。

若是物理层级上的一对一,且没有重复值,此时需要考虑能不能用一对一的对应关系,如下面新产品上市时的订单表和客户表(用客户ID进行连接),订单表上每一笔订单对应一个客户ID,客户表上客户ID是主键也没有重复值,此时就是一对一的对应关系,但这是假性的一对一,因为随着产品的上市时间增加,一个客户可能会产生多个订单,这样客户ID就有重复值,不能作为订单表的主键,此时订单表和客户表的连接就是多对一的对应关系。
因此,出现一对一的对应关系时,不能只看当前时点的数据,而需要结合实际的业务逻辑进行判断。

订单ID 客户ID 订单金额
1 a 100
2 b 100
3 c 100
客户ID 客户姓名
a 赵大
b 王二
c 张三

多对多

多对多对应关系在实际应用中可能出现,但是不能用,因为汇总时会出现重复项,如下面的订单表和订单详情表:
(订单表)

订单ID 客户ID 订单金额
1 a 100
2 a 100
3 b 100
总计 300

(订单详情表)

订单ID 产品ID 客户ID 产品金额
1 a-1 a 60
1 a-2 a 40
2 a-3 a 100
3 b-1 b 50
3 b-2 b 50
总计 300

当用客户ID进行连接时,就是多对多的对应关系,连接结果如下:

订单ID 客户ID 订单金额 订单ID 产品ID 客户ID 产品金额
1 a 100 1 a-1 a 60
1 a 100 1 a-2 a 40
1 a 100 2 a-3 a 100
2 a 100 1 a-1 a 60
2 a 100 1 a-2 a 40
2 a 100 2 a-3 a 100
3 b 100 3 b-1 b 50
3 b 100 3 b-2 b 50
总计 800 总计 500

当只考虑连接时,结果是没问题的。但结合到实际的业务场景中,连接的最终目的是为了汇总。而只有连续性的数值才能当度量进行汇总,所以只有订单金额和产品金额能进行汇总。连接后订单金额汇总值是800,产品金额汇总值是500,而连接前订单金额和产品金额的汇总值均为300,这时就会发现连接后的度量会比连接前的度量大,因为连接时都会在另一个表的重复项下翻倍,所以结果都不正确。

一对多

一对多对应关系是正确的连接关系,但也不是所有的汇总值都正确。例如,将上面的订单表和订单详情表的订单ID进行连接时,就是一对多的对应关系,连接结果如下:

订单ID 客户ID 订单金额 订单ID 产品ID 客户ID 产品金额
1 a 100 1 a-1 a 60
1 a 100 1 a-2 a 40
2 a 100 2 a-3 a 100
3 b 100 3 b-1 b 50
3 b 100 3 b-2 b 50
总计 500 总计 300

此时,一表中的订单金额汇总值不正确,但多表中的产品金额汇总值是正确的。故在一对多的对应关系下,只能多表出度量(连续型的数值),一表只能提供维度

本文地址:https://blog.csdn.net/qq_44684133/article/details/107663919

相关标签: MySQL Power BI