mysql两表汇总后再得到两表的交集和差集,请问怎么实现?

mysql两表汇总后再得到两表的交集和差集,请问怎么实现?,第1张

CREATE TABLE A (

`C1` VARCHAR(10),

`C2` VARCHAR(10),

`C3` VARCHAR(10),

`C4` VARCHAR(10),

`C5` INT

)

INSERT INTO A

SELECT '华北', '辽宁', '沈阳', '20020202', 2 UNION ALL

SELECT '华东', '山东', '青岛', '18020133', 3 UNION ALL

SELECT '华北', '北京', '北京', '7193', 7 UNION ALL

SELECT '华北', '北京', '北京', '8358', 5 UNION ALL

SELECT '华北', '北京', '北京', '9773', 8 UNION ALL

SELECT '华东', '山东', '青岛', '18020133', 5

CREATE TABLE B (

`C1` VARCHAR(10),

`C2` VARCHAR(10),

`C3` VARCHAR(10),

`C4` VARCHAR(10),

`C5` INT

)

INSERT INTO B

SELECT '华北', '辽宁', '沈阳', '20020202', 5 UNION ALL

SELECT '华东', '山东', '青岛', '18020133', 6 UNION ALL

SELECT '华北', '北京', '北京', '7193', 2 UNION ALL

SELECT '华东', '甘肃', '兰州', '7364', 3 UNION ALL

SELECT '华东', '湖北', '武汉', '7512', 7 UNION ALL

SELECT '华东', '湖北', '武汉', '7512', 2 UNION ALL

SELECT '华东', '江苏', '常州', '7582', 5 UNION ALL

SELECT '华东', '江苏', '淮安', '7670', 7

SELECT

IFNULL(A.`C1`, B.`C1`) AS `区域`,

IFNULL(A.`C2`, B.`C2`) AS `省份`,

IFNULL(A.`C3`, B.`C3`) AS `城市`,

IFNULL(A.`C4`, B.`C4`) AS `编码`,

SUM(A.`C5`) AS `表A销量`,

SUM(B.`C5`) AS `表B销量`

FROM

A LEFT JOIN B

ON (

A.`C1` = B.`C1` AND

A.`C2` = B.`C2` AND

A.`C3` = B.`C3` AND

A.`C4` = B.`C4`

)

GROUP BY

IFNULL(A.`C1`, B.`C1`),

IFNULL(A.`C2`, B.`C2`),

IFNULL(A.`C3`, B.`C3`),

IFNULL(A.`C4`, B.`C4`)

UNION

SELECT

IFNULL(A.`C1`, B.`C1`) AS `区域`,

IFNULL(A.`C2`, B.`C2`) AS `省份`,

IFNULL(A.`C3`, B.`C3`) AS `城市`,

IFNULL(A.`C4`, B.`C4`) AS `编码`,

SUM(A.`C5`) AS `表A销量`,

SUM(B.`C5`) AS `表B销量`

FROM

A RIGHT JOIN B

ON (

A.`C1` = B.`C1` AND

A.`C2` = B.`C2` AND

A.`C3` = B.`C3` AND

A.`C4` = B.`C4`

)

GROUP BY

IFNULL(A.`C1`, B.`C1`),

IFNULL(A.`C2`, B.`C2`),

IFNULL(A.`C3`, B.`C3`),

IFNULL(A.`C4`, B.`C4`)

+------+------+------+----------+---------+---------+

| 区域 | 省份 | 城市 | 编码 | 表A销量 | 表B销量 |

+------+------+------+----------+---------+---------+

| 华北 | 辽宁 | 沈阳 | 20020202 | 2 | 5 |

| 华北 | 北京 | 北京 | 7193 | 7 | 2 |

| 华北 | 北京 | 北京 | 8358 | 5 |NULL |

| 华北 | 北京 | 北京 | 9773 | 8 |NULL |

| 华东 | 山东 | 青岛 | 18020133 | 8 | 12 |

| 华东 | 甘肃 | 兰州 | 7364 |NULL | 3 |

| 华东 | 湖北 | 武汉 | 7512 |NULL | 9 |

| 华东 | 江苏 | 常州 | 7582 |NULL | 5 |

| 华东 | 江苏 | 淮安 | 7670 |NULL | 7 |

+------+------+------+----------+---------+---------+

9 rows in set (0.00 sec)

查询两张表数据不一致的记录,可以用求差集(非交集)的办法来解决。SQL语言求"差集"的办法相对于求"交集"的办法要少很多,一般可用not exists(非存在子句)或 左(右)连接后所产生空字段值来筛选两表的差集。下面举个例子供参考选出a表中与b表中id不一致的记录select a.* from a where not exists (select 1 from b where b.id=c.id)说明:上述语句只比对id一个字段,我们可以根据需要比对多个字段。not exists在比对字段有可利用的索引时,其运行效率是非常高,但是如果没有索引的情况下运行在大数据表时,其运行效率极差,这时应避免使用它,这时我们可改用左(右)连接来求差集。下面是用左连接来求差集的例子:1select a.* from a left join b on a.id=b.id where b.id is null用左(右)连接来求差集,由于需要实施两表连接会导致笛卡尔效应其输出集的记录行可能会增多,若果不是一对一或一对多,我们应该将多对多的情况处理成多对一后才进行连接,否则输出的记录集可能不正确。求差集的两种方法,有索引可利用时,not exists的效率要高于left join,反之left join效率更好。

根据文恩图的意义,可以看出:Ⅰ部分:A∩B,Ⅱ部分:A∩CUB,Ⅲ部分:B∩CU(A∩B),Ⅳ部分:CU(A∩B),只有第Ⅳ不是两个集合的交集的补集,而是两个集合的并集的补集,故选D.


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/7184866.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-02
下一篇 2023-04-02

发表评论

登录后才能评论

评论列表(0条)

保存