【发布时间】:2017-12-20 16:53:11
【问题描述】:
我正在用 MS SQL 编写一个非常简单的子查询,它返回了意外的结果。我试图返回的是一个存在于一个时间段但不存在于另一个时间段的账户号码列表。我的初始查询(粘贴在下面)返回了零行,这是意外的。
select
name1.acct
from
sym.dbo.name as name1
where
name1.processdate = 20171130
and name1.type = 0
and name1.acct not in
(
select
name2.acct
from
sym.dbo.name as name2
where
name2.type = 0
and name2.processdate = 20171031
)
但是,当我向子查询添加一行额外的逻辑并执行时,会返回给我预期的结果,见下文。
select
name1.acct
from
sym.dbo.name as name1
where
name1.processdate = 20171130
and name1.type = 0
and name1.acct not in
(
select
name2.acct
from
sym.dbo.name as name2
where
name2.type = 0
and name2.processdate = 20171031
and name2.acct <> '8888888'
)
最初我认为它可能与数据类型有关,所以我尝试将 acct 数字转换为 varchar 和 int 并获得相同的结果(使用转换而不是强制转换)。有人可以向我解释为什么查询一返回零结果而查询二返回预期结果吗?
我正在使用 Microsoft SQL Management Studio 2016。
谢谢
【问题讨论】:
-
您能否展示示例数据来验证您在两个查询中看到的结果?
-
您应该考虑对日期使用日期或日期时间数据类型,而不是整数。
标签: sql sql-server subquery sql-server-2016