Выберите значения, которые не встречаются в таблице - PullRequest
1 голос
/ 18 ноября 2011

Я уверен, что где-то спрашивали об этом, но мне было трудно искать.

Если я хочу получить все записи, в которых значение столбца равно одному в списке, я бы использовалIN оператор.

SELECT idSparePart, SparePartName 
  FROM tabSparePart 
  WHERE SparePartName IN (
      '1234-2043','1237-8026','1238-1036','1238-1039','1223-5172'
    )

Предположим, что SELECT возвращает 4 строки, хотя список содержит 5 элементов.Как выбрать значение, которое не встречается в таблице?

Заранее спасибо.

Ответы [ 4 ]

2 голосов
/ 18 ноября 2011

Как только вы упомянули, что мне нужно создать временную таблицу, я вспомнил свою Split -функцию.

Извините за ответ на мой собственный вопрос, но это может быть лучший / самый простой способ дляme:

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

My Split -функция: Справка по поисковому запросу sql с использованием параметра с разделителями-запятыми

В любом случае, спасибо всем.

2 голосов
/ 18 ноября 2011
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 голос
/ 18 ноября 2011

Вы можете попробовать что-то вроде этого ...

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 или гигант выберите объединение подзапрос.

1 голос
/ 18 ноября 2011

Обновление : Я неправильно понял вопрос. Я думаю, что в этом случае я бы выбрал значения во временную таблицу, а затем выбрать значения, которых нет в этой таблице. Я знаю, что это не идеально, проблема в том, что вам нужно каким-то образом получить список имен деталей на SQL Server (либо через IN, либо поместив их во временную таблицу), но семантика 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":

SELECT * from tabSparePart WHERE SparePartName NOT in(
'1234-2043','1237-8026','1238-1036','1238-1039','1223-5172'
)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...