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上,该部分为真