我有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;
(我希望有更好的查询。)
我应该对所有表都有相同的查询。 然后加入所有人。
有更好的解决方案吗?
答案 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条件。