我有一个包含3列的表(name,objectroot_dn,distinguishedname)。此处 distinguishedname 类似于 objectroot_dn 的父级。我必须找出每个 objectroot_dn 是否存在儿童?
我可以使用下面的查询来完成此操作。如果有孩子,它将返回 True ,如果没有,则返回 False 。但我的问题是当总数据集增加时需要花费很多时间。
例如,如果行总数为50,000,则此查询完成需要10分钟。
由于我使用不同数据库的框架,我无法对列进行索引。
SELECT name, objectroot_dn, distinguishedname, CASE WHEN (SELECT count(*) FROM (SELECT name FROM elaoucontainergeneraldetails WHERE objectroot_dn = dn.distinguishedname LIMIT 1) AS tabel1) > 0 THEN 'True' ELSE 'False' END FROM elaoucontainergeneraldetails AS dn WHERE objectroot_dn = 'SOME_VALUE';
请告诉我如何提高此查询的速度。
提前致谢。感谢所有帮助。
答案 0 :(得分:1)
您可以使用左连接或存在使用相同的解决方案:
SELECT
dn.name,
dn.objectroot_dn,
dn.distinguishedname,
CASE
WHEN dn_in.objectroot_dn is not null
THEN 'True'
ELSE 'False'
END
FROM elaoucontainergeneraldetails AS dn
LEFT JOIN elaoucontainergeneraldetails dn_in on dn_in.objectroot_dn = dn.distinguishedname
WHERE objectroot_dn = 'SOME_VALUE';
答案 1 :(得分:1)
EXISTS(subquery)
产生一个布尔值:
SELECT dn.name
, dn.objectroot_dn
, dn.distinguishedname
, EXISTS (SELECT *
FROM elaoucontainergeneraldetails nx
WHERE nx.objectroot_dn = dn.distinguishedname
) AS truth_value
FROM elaoucontainergeneraldetails AS dn
WHERE dn.objectroot_dn = 'SOME_VALUE'
;