目录

示例源数据

解决方案

笛卡儿积导致数据虚增的原因


示例源数据

材料表

定额名称

单位

数量

钢管


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行数据。在处理大数据时,笛卡儿积有时会导致主机停止或电脑死机。所以必须谨慎处理好笛卡儿积的情况。