Sql server 2005 选择表中未出现的值

Sql server 2005 选择表中未出现的值,sql-server-2005,tsql,Sql Server 2005,Tsql,我肯定有人问过这个问题,但我发现很难找到 如果我想获取列表中列值等于1的所有记录,我会使用运算符 SELECT idSparePart, SparePartName FROM tabSparePart WHERE SparePartName IN ( '1234-2043','1237-8026','1238-1036','1238-1039','1223-5172' ) 假设此选择返回4行,但列表有5项。如何选择表中未出现的值 提前谢谢。更新:我误解了这个问题

我肯定有人问过这个问题,但我发现很难找到

如果我想获取列表中列值等于1的所有记录,我会使用运算符

SELECT idSparePart, SparePartName 
  FROM tabSparePart 
  WHERE SparePartName IN (
      '1234-2043','1237-8026','1238-1036','1238-1039','1223-5172'
    )
假设此选择返回4行,但列表有5项。如何选择表中未出现的值

提前谢谢。

更新:我误解了这个问题。我想在这种情况下,我会选择临时表中的值,然后选择不在该表中的值。不理想,我知道-问题是您需要以某种方式通过IN或将部件名列表放入临时表中,将部件名列表发送到SQL Server,但IN的语义并不能满足您的需要

大概是这样的:

CREATE TABLE tabSparePart
(
    SparePartName  nvarchar(50)
)
insert into tabSparePart values('1234-2043')


CREATE TABLE #tempSparePartName
(
    SparePartName  nvarchar(50)
)
insert into #tempSparePartName values('1234-2043')
insert into #tempSparePartName values('1238-1036')
insert into #tempSparePartName values('1237-8026') 

select * from #tempSparePartName
where SparePartName not in (select SparePartName from tabSparePart)
输出:

SparePartName
1238-1036
1237-8026
原始错误答案: 您可以仅在以下情况下使用not:

更新:我误解了这个问题。我想在这种情况下,我会选择临时表中的值,然后选择不在该表中的值。不理想,我知道-问题是您需要以某种方式通过IN或将部件名列表放入临时表中,将部件名列表发送到SQL Server,但IN的语义并不能满足您的需要

大概是这样的:

CREATE TABLE tabSparePart
(
    SparePartName  nvarchar(50)
)
insert into tabSparePart values('1234-2043')


CREATE TABLE #tempSparePartName
(
    SparePartName  nvarchar(50)
)
insert into #tempSparePartName values('1234-2043')
insert into #tempSparePartName values('1238-1036')
insert into #tempSparePartName values('1237-8026') 

select * from #tempSparePartName
where SparePartName not in (select SparePartName from tabSparePart)
输出:

SparePartName
1238-1036
1237-8026
原始错误答案: 您可以仅在以下情况下使用not:


你可以试试这样的

declare @test as table
(
    items varchar(50)
)

insert into @test
    values('1234-2043')

insert into @test
    values('1234-2043')

insert into @test
    values('1237-8026') 

-- the rest of the values --

select * from @test
    where items not in (
        select theItemId from SparePartName 
        )
为了好玩,看看这个。。。


它向您展示了如何获取分隔数据并将其作为单独的行从表值函数返回。。。这使得创建要从中选择的表的过程比插入到@table或执行巨大的select union子查询更容易。

您可以尝试这样的操作

declare @test as table
(
    items varchar(50)
)

insert into @test
    values('1234-2043')

insert into @test
    values('1234-2043')

insert into @test
    values('1237-8026') 

-- the rest of the values --

select * from @test
    where items not in (
        select theItemId from SparePartName 
        )
select t.* from (
    select '1234-2043' as sparePartName
    union select '1237-8026'
    union select '1238-1036'
    union select '1238-1039'
    union select '1223-5172'
) t
where not exists (
    select 1 from tabSparePart p WHERE p.SparePartName = t.sparePartName
)
为了好玩,看看这个。。。


它向您展示了如何获取分隔数据并将其作为单独的行从表值函数返回。。。这使得创建要从中选择的表的过程比插入@table或执行大型select union子查询更容易。

您一提到我必须创建临时表,我就想起了我的拆分函数

select t.* from (
    select '1234-2043' as sparePartName
    union select '1237-8026'
    union select '1238-1036'
    union select '1238-1039'
    union select '1223-5172'
) t
where not exists (
    select 1 from tabSparePart p WHERE p.SparePartName = t.sparePartName
)
很抱歉回答我自己的问题,但这可能是我最好/最简单的方式:

SELECT PartNames.Item
FROM   dbo.Split('1234-2043,1237-8026,1238-1036,1238-1039,1223-5172', ',') AS PartNames  
       LEFT JOIN tabSparePart ON tabSparePart.SparePartName = PartNames.Item
WHERE idSparePart IS NULL
我的拆分功能:


无论如何,谢谢大家。

您一提到我必须创建一个临时表,我就想起了我的拆分函数

很抱歉回答我自己的问题,但这可能是我最好/最简单的方式:

SELECT PartNames.Item
FROM   dbo.Split('1234-2043,1237-8026,1238-1036,1238-1039,1223-5172', ',') AS PartNames  
       LEFT JOIN tabSparePart ON tabSparePart.SparePartName = PartNames.Item
WHERE idSparePart IS NULL
我的拆分功能:


谢谢大家。

这将返回表中不在列表中的所有记录。我想要列表中所有不在表中的项目。啊,我误解了这个问题。这将返回表中所有不在列表中的记录。我想要列表中所有不在表中的项目。啊,我误解了这个问题。如果它不在表中,你会让它作为第五行返回什么?@Matti:我只关心哪些SparePartNames不在表中。因为我没有超过名称,所以只获取名称就足够了。ID列可以为空。如果它不在表中,您会让它作为第五行返回什么?@Matti:我只关心哪些SparePartNames不在表中。因为我没有超过名称的内容,所以只获取名称就足够了。ID列可以为空。我希望有一种更简单的方法,因为在SSMS中,我经常需要一个长长的项目列表。@TimSchmelter:如何将这个长长的列表传递给查询?复制和粘贴。我记得这可能是最简单的方法,因为我不需要手动在临时表中插入所有这些值。我希望有一种更简单的方法,因为在SSMS中,我经常需要一个长长的项目列表。@TimSchmelter:如何将这个长长的列表传递给查询?复制和粘贴。我记得这可能是最简单的方法,因为我不需要手动在临时表中插入所有这些值。我想这就是路。是的,我也是。我想这是一条路。