Запрос: найти строки, которые не принадлежат списку значений - PullRequest
8 голосов
/ 08 июля 2010

Давайте рассмотрим, у меня есть таблица 'Tab', в которой есть столбец 'Col'

Таблица 'Tab' содержит эти данные -

Col
1
2
3
4
5

Если у меня есть набор значений(2,3,6,7).Я могу запросить значения, которые присутствуют в таблице и списке, предъявив иск

Select Col from Tab where col IN (2,3,6,7)

Но, если я хочу вернуть значения в списке, которых нет в таблице, т.е. только (67) в данном случае.Какой запрос я должен использовать?

Ответы [ 7 ]

3 голосов
/ 08 июля 2010

Проблема, которую я считаю, заключается в том, что вы пытаетесь найти ценности от вас в заявлении. То, что вам нужно сделать, это превратить ваше заявление в таблицу, а затем вы можете определить, какие значения отличаются.

create table #temp
(
value int
)

insert into #temp values 1
insert into #temp values 2
insert into #temp values 3
insert into #temp values 4

select
 id
from
 #temp
where
 not exists (select 1 from Tab where Col = id)

Лучшей альтернативой было бы создание табличной функции для преобразования строки, разделенной запятыми, в таблицу. У меня нет удобного кода, но его легко найти в Google. В этом случае вам нужно будет использовать только следующий синтаксис.

select
 id
from
 dbo.SplitStringToTable('2,3,6,7')
where
 not exists (select 1 from Tab where Col = id)

Надеюсь, это поможет

3 голосов
/ 08 июля 2010

Метод SQL Server 2008

SELECT N FROM (VALUES(2),(3),(6),(7)) AS D (N)
EXCEPT
Select Col from Tab

Или SQL Server 2005

DECLARE @Values XML

SET @Values = 
'<r>
    <v>2</v>
    <v>3</v>
    <v>6</v>
    <v>7</v>
</r>' 


SELECT 
    vals.item.value('.[1]', 'INT') AS Val
FROM @Values.nodes('/r/v') vals(item)
EXCEPT
Select Col from Tab
2 голосов
/ 08 июля 2010

одним из способов будет использование временной таблицы:

DECLARE @t1 TABLE (i INT) 
INSERT @t1 VALUES(2) 
INSERT @t1 VALUES(3)
INSERT @t1 VALUES(6) 
INSERT @t1 VALUES(7)

SELECT i FROM @t1 WHERE i NOT IN (Select Col from Tab)
0 голосов
/ 08 июля 2010

Поздно на вечеринку ...

SELECT 
    '2s' = SUM(CASE WHEN Tab.Col = 2 THEN 1 ELSE 0 END),
    '3s' = SUM(CASE WHEN Tab.Col = 3 THEN 1 ELSE 0 END),
    '6s' = SUM(CASE WHEN Tab.Col = 6 THEN 1 ELSE 0 END),
    '7s' = SUM(CASE WHEN Tab.Col = 7 THEN 1 ELSE 0 END)
FROM
(SELECT 1 AS Col, 'Nums' = 1 UNION SELECT 2 AS Col,'Nums' = 1 UNION SELECT 3 AS Col,      'Nums' = 1 UNION SELECT 4 AS Col, 'Nums' = 1 UNION SELECT 5 AS Col, 'Nums' = 1 ) AS Tab
GROUP BY Tab.Nums

Кстати, мой также дает количество каждого, полезно, если вам это нужно. Например, если вы сверяли список товаров с тем, что есть в инвентаре. Хотя вы можете написать стержень для этого лучше, просто не знаю, как с моей головы.

0 голосов
/ 08 июля 2010

Я думаю, что есть много способов достичь этого, вот один.

SELECT a.col 
FROM 
  (SELECT 2 AS col UNION ALL SELECT 3 UNION ALL SELECT 6 UNION ALL SELECT 7) AS a
WHERE a.col NOT IN (SELECT col FROM Tab)
0 голосов
/ 08 июля 2010

У вас есть таблица [цифр] в вашей базе данных?(См. Почему я должен рассмотреть возможность использования таблицы вспомогательных номеров? )

SELECT
    [Tab].*
FROM
    [numbers]
    LEFT JOIN [Tab]
        ON [numbers].[num] = [Tab].[Col]
WHERE
    [numbers].[num] IN (2, 3, 6, 7)
    AND [Tab].[Col] IS NULL
0 голосов
/ 08 июля 2010

Один метод -

declare @table table(col int)
insert into @table
select 1 union all
select 2  union all
select 3  union all
select 4  union all
select 5 


declare @t table(col int)
insert into @t
select 2 union all
select 3 union all
select 6 union all
select 7 

select t1.col from @t as t1 left join @table as t2 on t1.col=t2.col
where t2.col is null
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...