我确定已经在某处询问过,但我发现很难搜索。
如果我想获取列值等于列表值的所有记录,我会使用IN
运算符。
SELECT idSparePart, SparePartName
FROM tabSparePart
WHERE SparePartName IN (
'1234-2043','1237-8026','1238-1036','1238-1039','1223-5172'
)
假设此SELECT
返回4行,但列表中有5个项目。如何选择表中未出现的值?
提前致谢。
答案 0 :(得分:2)
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
)
答案 1 :(得分:2)
一旦你提到我必须创建一个临时表,我就记得我的Split
- 函数。
很抱歉回答我自己的问题,但这对我来说可能是最好/最简单的方式:
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
我的Split
- 功能:
Help with a sql search query using a comma delimitted parameter
无论如何,谢谢大家。
答案 2 :(得分:1)
更新:我误解了这个问题。我想在那种情况下我会将值选择到临时表中,然后选择不在该表中的值。不太理想,我知道 - 问题是你需要以某种方式将你的部件名单列入SQL Server(通过IN或将它们放在临时表中)但是IN的语义不能达到你想要的效果。 / p>
这样的事情:
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
”:
SELECT * from tabSparePart WHERE SparePartName NOT in(
'1234-2043','1237-8026','1238-1036','1238-1039','1223-5172'
)
答案 3 :(得分:1)
你可以尝试这样的事情......
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
)
为了好玩,看看这个...... http://blogs.microsoft.co.il/blogs/itai/archive/2009/02/01/t-sql-split-function.aspx
它向您展示了如何获取分隔数据并将其从表值函数作为单独的“行”返回...这使我创建表的过程更容易选择,而不是插入@table或做巨人选择union子查询。