如何查询依赖于同一个表的其他值的SQL语句?

时间:2016-11-14 11:45:10

标签: mysql sql performance postgresql relational-database

我有一个包含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';

请告诉我如何提高此查询的速度。

提前致谢。感谢所有帮助。

2 个答案:

答案 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'
   ;
相关问题