不存在是不是过滤掉了太多结果?

Posted

技术标签:

【中文标题】不存在是不是过滤掉了太多结果?【英文标题】:Not exists is filtering out too many results?不存在是否过滤掉了太多结果? 【发布时间】:2015-05-13 16:42:34 【问题描述】:

我在尝试找出此查询未返回任何记录的原因时遇到问题。

我有一个查询如下

     SELECT c.desc
     FROM tableA a
     INNER JOIN TableB b ON a.name = b.name
     INNER JOIN TableC c ON b.id= c.Id
     WHERE NOT EXISTS (SELECT 1
                       FROM TableC 
                       WHERE tablec.desc IN 
                        ( SELECT DISTINCT d.desc
                          FROM TableD d 
                          INNER JOIN TableE on e.Id = d.Id 
                        )
                      )
        AND c.active =1
        AND b.active=1

现在不存在的内部查询本身返回62条记录,没有不存在的外部查询返回232,但是当如上运行时它们返回0,我不知道为什么。 62 条记录是唯一的,232 条也是唯一的,现在有 31 条记录重叠,所以我希望发布的查询返回 201 条记录,但我得到的结果为零。 抱歉格式化,但我是通过手机发布的。

【问题讨论】:

【参考方案1】:

您还没有将NOT EXISTS 中的查询与外部查询相关联,这应该通过WHERE 子句来完成,一个简单的示例:

SELECT *
FROM Table1 a
WHERE NOT EXISTS (SELECT 1
                  FROM Table2 b
                  WHERE a.ID = b.ID
                  )

不过,我希望它不会过滤任何行,所以肯定还有另一个问题。

这是修复您的查询的一个尝试,我注意到 TableE 缺少别名:

SELECT C.DESC
FROM TABLEA A
INNER JOIN TABLEB B     ON A.NAME = B.NAME
INNER JOIN TABLEC C     ON B.ID= C.ID
WHERE NOT EXISTS (SELECT 1
                  FROM TABLEC C2
                  WHERE C2.DESC IN (SELECT DISTINCT D.DESC
                                    FROM TABLED D 
                                    INNER JOIN TABLEE E ON E.ID = D.ID )
                        AND C2.DESC = C.Desc  --Relationship between inner/outer
                  )
  AND C.ACTIVE = 1
  AND B.ACTIVE = 1

根据TableCTableD之间的关系,最终整个事情可能会被清理干净,也许很简单:

SELECT C.DESC
FROM TABLEA A
INNER JOIN TABLEB B     ON A.NAME = B.NAME
INNER JOIN TABLEC C     ON B.ID= C.ID
WHERE C.DESC NOT IN (SELECT DISTINCT D.DESC
                     FROM TABLED D 
                       INNER JOIN TABLEE E ON E.ID = D.ID )                     
                    )
  AND C.ACTIVE = 1
  AND B.ACTIVE = 1

【讨论】:

我不敢相信我没有看到内部和外部查询之间的关系,我选择了第二条路线,因为内部查询比我发布的要复杂一些。但是,现在我得到了我的预期。有时你只需要第二双眼睛。

以上是关于不存在是不是过滤掉了太多结果?的主要内容,如果未能解决你的问题,请参考以下文章

Redis缓存知识问题

如何检查图像是不是存在于特定位置?

redis应用实战(布隆过滤器)

Core Data 花费了太多时间

Laravel 获取一个查询以检查 QueryBuilder 是不是存在两个关系中的至少一个而不忽略其他过滤器

如何从我的 Powershell 脚本中的 Get-ADUser 过滤器获取结果,以便验证该用户是不是存在?