今天同事问我,两个表自关联,关联条件是某几个字段,为什么得到的结果比原本要少.
我也觉得不应该,想知道原因,就拿dm的一个表做了下测试,发现果然如此,数据少了一些.

SELECT count(1) FROM dm_fxfm_sdxzqy;

SELECT count(1)
FROM (SELECT * FROM dm_fxfm_sdxzqy) t1
JOIN (SELECT * FROM dm_fxfm_sdxzqy) t2
ON t1.uuid=t2.uuid 
AND t1.tyshxydm= t2.tyshxydm
AND t1.ztsfdm= t2.ztsfdm
AND t1.zzjgdm= t2.zzjgdm
;

关联的字段越多,条数越少...
想了一会了没想到原因,就在mysql中又试了下,发现也是会少数据...

所以自己建了个测试表,来整明白为什么会这样.
原始数据:

f1    f2    f3
a    A    1
b        2
c    C    3
d    A    4
e         5

把字段f2作为控制变量,存在不同,相同,空串,空格的情况
SQL:

SELECT * 
FROM (SELECT * FROM t1) tt1
JOIN (SELECT * FROM t1) tt2
ON tt1.f1=tt2.f1 
AND tt1.f2=tt2.f2

结果:

f1    f2    f3    f1(1)    f2(1)    f3(1)
a    A    1    a    A    1
b        2    b        2
c    C    3    c    C    3
d    A    4    d    A    4
e          5    e          5

发现数据没少...这里就纳闷了.突然想到了null,上面原始数据没有null,而是空字符串和空格
加两个null的行试试:

UPDATE t1 SET f2=NULL WHERE f1='b';
INSERT t1 VALUES('f',NULL,'6'); 

数据:

f1    f2    f3
a    A    1
b        2
c    C    3
d    A    4
e          5
f        6

b行和f行的f2为null,再次运行sql,果然...

f1    f2    f3    f1(1)    f2(1)    f3(1)
a    A    1    a    A    1
c    C    3    c    C    3
d    A    4    d    A    4
e          5    e          5

这里就证实了是null存在的问题导致关联不上的.
随手写了个判断:

SELECT IF(NULL = NULL,1,0)

结果是0,完毕..