Tsql WHERE in NOT EXISTS子句被忽略

Tsql WHERE in NOT EXISTS子句被忽略,tsql,Tsql,我试图用应该存在的行填充表格:如果@Maps中的城市在@Results中不存在,那么我将使用not EXISTS填充它。问题是过滤器isused=1不仅被忽略,而且似乎使不存在的文件无效 使用IsUsed=1,@Maps中的所有内容都将插入@Results,而不管它是否存在 如果我删除IsUsed=1,则会插入NY中的两行(正确的行为,但不是我想要的) 代码如下: declare @Maps table ( Name varchar(20), IsUsed bit, Co

我试图用应该存在的行填充表格:如果
@Maps
中的城市在
@Results
中不存在,那么我将使用
not EXISTS
填充它。问题是过滤器
isused=1
不仅被忽略,而且似乎使
不存在的文件无效

使用
IsUsed=1
,@Maps中的所有内容都将插入@Results,而不管它是否存在

如果我删除
IsUsed=1
,则会插入NY中的两行(正确的行为,但不是我想要的)

代码如下:

declare @Maps table
(
    Name varchar(20),
    IsUsed bit,
    Code varchar(20)
)

insert into @Maps
select 'NY', 1, 'NY1'
union select 'NY', 0, 'NY2'
union select 'FL', 0, 'FL1'
union select 'TX', 0, 'TX1'

declare @Results table 
(
    Name varchar(20),
    Value int,
    Code varchar(20)
)
insert into @results
select 'FL', 12, 'FL1'
union
select 'TX', 54,'TX1'
union
select 'CA', 54,'CA1'
union
select 'NJ', 54,'NJ1'

insert into @results
select Name, 999, code from @Maps m
-- This adds everything even if it exists
where not exists (select name from @Results p where p.name = m.name and IsUsed = 1)
-- This adds both 'NY'. Partially correct but adds column IsUsed = 0
-- where not exists (select name from @Results p where p.name = m.name)

select * from @results
如何添加未包含在
@results
中且已使用等于1的一行?在这种情况下,它将是
{'NY',1',NY1
}`


我知道有很多方法可以做到这一点,但我想知道
中的
where
子句是如何工作的。

您必须从
not exists
中删除
IsUsed=1
,并将其添加到
where

insert into @results
select Name, 999, code 
from @Maps m
where m.IsUsed = 1
and not exists (select name from @Results p where p.name = m.name)

您必须从不存在的
中删除
IsUsed=1
,并将其添加到
中,其中

insert into @results
select Name, 999, code 
from @Maps m
where m.IsUsed = 1
and not exists (select name from @Results p where p.name = m.name)

我认为您混淆了
插入
选择
的工作原理。select独立运行。直到语句结束时才提交insert。请参阅所有插入的cnt为4

declare @maps table(name varchar(10), isUsed bit, code varchar(10));
insert into @Maps values 
       ('NY', 1, 'NY1')
     , ('NY', 0, 'NY2')
     , ('FL', 0, 'FL1')
     , ('TX', 0, 'TX1')

declare @Results table (Name varchar(20), Value int, Code varchar(20), cnt int)
insert into @results values
       ('FL', 12, 'FL1', null)
     , ('TX', 54, 'TX1', null)
     , ('CA', 54, 'CA1', null)
     , ('NJ', 54, 'NJ1', null)

select * from @results;
insert into @Results
select m.Name, 999, m.code 
     , (select count(*) from @results) as cnt 
  from @Maps m 
 where not exists (select name 
                     from @Results p 
                    where p.name = m.name 
                      and m.IsUsed = 1) 
select * from @results;
在第一个NY
上,其中p.name=m.name
为假,因此
不退出
为真

在第二个NY
上,其中p.name=m.name
为假,因此
不存在
为真
第一个被认为是未犯的罪行


在FL和TL上,
其中p.name=m.name
为真,但
m.IsUsed=1
为假,因此
不退出
为真

我认为您混淆了
插入
选择
的工作原理。select独立运行。直到语句结束时才提交insert。请参阅所有插入的cnt为4

declare @maps table(name varchar(10), isUsed bit, code varchar(10));
insert into @Maps values 
       ('NY', 1, 'NY1')
     , ('NY', 0, 'NY2')
     , ('FL', 0, 'FL1')
     , ('TX', 0, 'TX1')

declare @Results table (Name varchar(20), Value int, Code varchar(20), cnt int)
insert into @results values
       ('FL', 12, 'FL1', null)
     , ('TX', 54, 'TX1', null)
     , ('CA', 54, 'CA1', null)
     , ('NJ', 54, 'NJ1', null)

select * from @results;
insert into @Results
select m.Name, 999, m.code 
     , (select count(*) from @results) as cnt 
  from @Maps m 
 where not exists (select name 
                     from @Results p 
                    where p.name = m.name 
                      and m.IsUsed = 1) 
select * from @results;
在第一个NY
上,其中p.name=m.name
为假,因此
不退出
为真

在第二个NY
上,其中p.name=m.name
为假,因此
不存在
为真
第一个被认为是未犯的罪行


在FL和TL上,
其中p.name=m.name
为真,但
m.IsUsed=1
为假,因此
不退出
为真

我已编辑。谢谢你指出,我已经编辑过了。谢谢你指出。好吧,那很简单。谢谢。如果过滤器位于
不存在
中,为什么它会忽略该过滤器?@rbhat-您使用的查询应该会出现错误,因为
列已使用
@Results
中不存在,并且您的
不存在
部分应该有错误@rbhat:因为满足了
不存在
条件,所以
@Results
中没有记录具有映射中的
NY
-名称,
被使用
是不相关的,因为第一个条件已经为false。你想在
@Maps
上进行过滤,因此你应该在那里包括
已使用的
过滤器。@TimSchmelter但在第二个纽约,这一部分将是真实的,这很简单。谢谢。如果过滤器位于
不存在
中,为什么它会忽略该过滤器?@rbhat-您使用的查询应该会出现错误,因为
列已使用
@Results
中不存在,并且您的
不存在
部分应该有错误@rbhat:因为满足了
不存在
条件,所以
@Results
中没有记录具有映射中的
NY
-名称,
被使用
是不相关的,因为第一个条件已经为false。您想在
@Maps
上进行筛选,因此应该在此处包含
已使用的
筛选器。@TimSchmelter,但在第二个NY上,该部分为真