从各个表中选择公共元素,其中所有值都不为空

时间:2017-05-10 16:54:12

标签: mysql

我有3个表,A,B和C.每个表都有一个公共列,ID和其他数据。 我希望拥有每个表中的所有ID以及所有数据都不为空的ID。 最有效的方法是什么? 在我的实际案例中,我有超过5个表。

前:

Table A
| ID | A_1 | A_2 | A_3 | A_4 | A_5 | A_6 |

Table B
| ID | B_1 | B_2 | B_3 | B_4 |

Table C
| ID | C_1 | C_2 | C_3 | C_4 | C_5 | C_6 | C_7 | C_8 |

此查询将获取三个表中的所有共同ID。

SELECT  distinct ID FROM A
where  
   exists(select 1 from B where A.ID = B.ID )
   AND exists(select 1 from C where A.ID = C.ID );

此查询将选择所有列都为非null的ID:

SELECT ID 
FROM A
WHERE A_1 IS NOT NULL AND A_2 IS NOT NULL AND A_3 IS NOT NULL AND A_4 IS NOT NULL AND A_5 IS NOT NULL;

(我希望有更好的查询。)

我应该对所有表都有相同的查询。 然后加入所有人。

有更好的解决方案吗?

1 个答案:

答案 0 :(得分:0)

这应该有效:

SELECT DISTINCT A.ID
FROM A
INNER JOIN B ON A.ID = B.ID AND B.value IS NOT NULL
INNER JOIN C ON A.ID = C.ID AND C.value IS NOT NULL
INNER JOIN D ON A.ID = D.ID AND D.value IS NOT NULL
INNER JOIN E ON A.ID = E.ID AND E.value IS NOT NULL
WHERE A.value IS NOT NULL
;

它的缺点是,如果存在一个或多个一对多关系,则中间结果可能会爆炸性地爆发。一个更好的解决方案可能与你的第一个例子更相似;但不是使用相关的EXISTS子查询......

SELECT DISTINCT ID 
FROM A
WHERE A.Value IS NOT NULL 
   AND A.ID IN (SELECT DISTINCT ID FROM B WHERE Value IS NOT NULL)
   AND A.ID IN (SELECT DISTINCT ID FROM C WHERE Value IS NOT NULL)
   AND A.ID IN (SELECT DISTINCT ID FROM D WHERE Value IS NOT NULL)
   AND A.ID IN (SELECT DISTINCT ID FROM E WHERE Value IS NOT NULL)
   ...etc

这样做的缺点是你不会从ID索引中获得任何好处。如果"爆炸"我提到的问题并不是一个问题,ID在所有或大多数表格上编入索引,我的第一个建议可能更快,更有效。

编辑:哦,我忽略了你的意思是每个表中的多个值都是NOT NULL,但同样的概念应该适用,你只需用Value IS NOT NULL替换所有AND条件相应列上的IS NOT NULL条件。