目录
示例源数据
解决方案
笛卡儿积导致数据虚增的原因
示例源数据
材料表
定额名称 | 单位 | 数量 |
钢管 | 支 | 25 |
镀管 | 支 | 25 |
角钢 | 支 | 100 |
角钢 | 支 | 98 |
镀管 | 支 | 69 |
镀管 | 支 | 50 |
镀管 | 支 | 30 |
天津大小头 | 只 | 5 |
天津大小头 | 只 | 25 |
天津大小头 | 只 | 40 |
天津三通 | 只 | 5 |
天津三通 | 只 | 3 |
天津三通 | 只 | 5 |
机械三通 | 只 | 10 |
机械三通 | 只 | 16 |
机械三通 | 只 | 2 |
机械三通 | 只 | 5 |
机械三通 | 只 | 8 |
沟槽弯头 | 只 | 10 |
沟槽弯头 | 只 | 10 |
单价表
定额名称 | 单价 |
钢管 | 1.55 |
镀管 | 0.56 |
镀管 | 0.4 |
角钢 | 0.4 |
天津大小头 | 0.5 |
天津三通 | 3.2 |
机械三通 | 7.3 |
沟槽弯头 | 2.3 |
如图所示为某公司材料进货表及材料的单价表,其中镀菅有两种不同的单价,现需要把定额名称、单位、数量、单价等信息汇总在一个总数据表中,应如何操作?
解决方案
SELECT A.定额名称,单位,数量,单价
FROM [sheet1$] A,[sheet2$] B
WHERE A.定额名称=B.定额名称
笛卡儿积导致数据虚增的原因
在本例中,材料进货表中的定额名称出现了4次镀管,而单价表中的定额名称出现了2次镀管,进行多表连接后,结果表中出现有关镀管的记录条数为8条(即4x2=8),其显示了这些匹配的所有可能的组合和排列。这两个表之间是多对多的关系,又称为笛卡儿积现象。
笛卡儿积是笛卡儿结合或“无结合“的结果。如果从两个或多个没有结合的表里获取数据,输出的结果就是所有被选表的全部行记录的排列组合。如果表的规模很大,其结果可能是几十万,甚至是数百万行的数据。
如果材料进货表出现10次镀管,单价表中出现10种不同的单价,两个表进行关联,结果表中将会产生100行连接后的记录,从而导致结果表很容易变得非常庞大,数据无缘无故进行虚增。
在查询中进行多表连接时要特别小心。如果查询的两个表没有结合,而且每个表都包含1000行数据,那么笛卡儿积就会是1000×1000,也就是1000000行数据。在处理大数据时,笛卡儿积有时会导致主机停止或电脑死机。所以必须谨慎处理好笛卡儿积的情况。