存在于 where 子句中返回不正确的结果

Posted

技术标签:

【中文标题】存在于 where 子句中返回不正确的结果【英文标题】:Exists in where clause return incorrect result 【发布时间】:2012-02-03 21:32:59 【问题描述】:

请考虑这个查询:

SELECT tesd.State_Code,
   tesd.City_Code,
   tesd.Row_ID,
   tesd.Qsno,
   tesd.Total_Period,
   tesd.Current_Period,
   tesd.Week,
   tesd.Block_No,
   tesd.Family_ID,
   tesd.Line_ID,
   tesd.Page_ID
   INTO #tmp
FROM   Specification_Master tesm
   INNER JOIN Specification_Details tesd
        ON  tesd.Master_Id = tesm.Id
WHERE  tesm.[Year] = 2000
   AND tesm.[Month] = 10
   AND tesd.City_Code IN ('001')

我从 2 个表中查询了一些数据并将它们插入到 #tmp 中。然后我想从其他 2 个表中选择数据并检查其中一个表在 #tmp tbale 中有值:

SELECT *
FROM   tbl_Details D
   INNER JOIN tbl_Master tem
        ON  D.ID_Master = tem.Id
WHERE  D.Period <= 5
 AND EXISTS (
           SELECT Row_ID
           FROM   #tmp tm
           WHERE  tm.Current_Period > 1
                  AND tm.State_Code = tem.State_Code
                  AND tm.City_Code = tem.City_Code
                  AND tm.Qsno = tem.Qsno
       )
   AND D.[Status] > 2 

当我运行这个查询时,我只得到了一行,但是当我将 EXISTS 更改为 NOT EXISTS 时,我得到了更多的行。我单独运行这个查询:

SELECT Row_ID
           FROM   #tmp tm,tbl_Master tem 
           WHERE  tm.Current_Period > 1
                  AND tm.Ostan_Code = tem.State_Code
                  AND tm.City_Code = tem.City_Code
                  AND tm.Porseshname_ID = tem.Qsno

它返回 30 行。为什么Exists 会有这样的行为?

【问题讨论】:

如何分别运行第三个?那里没有定义 tem 别名。 在您的第二个查询中,我看到了与 tbl_details 的联合。只是想知道没有存在块的查询返回了多少行。 【参考方案1】:

Exists 根据子查询的结果返回一个布尔值。返回 1 行还是 30 行并不重要。您检索的行数基于 select * 语句,而不是 Exists 子句。

【讨论】:

以上是关于存在于 where 子句中返回不正确的结果的主要内容,如果未能解决你的问题,请参考以下文章

优先考虑 SQL WHERE 子句

Laravel - 从一个表中获取不存在于另一个表中的记录,并附加了 where 子句

如何为'where'子句中的项目返回一些默认值,这些项目在数据库表列中不匹配(不存在)

oracle 需要当心的WHERE子句

ODP.NET / EF6 - WHERE 子句中的 CHAR 数据类型

如何使用带有过滤器 where 子句的 oracle 外连接