Запрос: найдите строки, которые не принадлежат списку значений

Позволяет полагают, что у меня есть таблица 'Tab', которая имеет столбец 'Col'

Таблица 'Tab' имеет эти данные -

Col
1
2
3
4
5

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

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

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

8
задан Martin Smith 11 October 2011 в 09:17
поделиться

7 ответов

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

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
ответ дан 5 December 2019 в 20:13
поделиться

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

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
ответ дан 5 December 2019 в 20:13
поделиться

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

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)
2
ответ дан 5 December 2019 в 20:13
поделиться

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

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
ответ дан 5 December 2019 в 20:13
поделиться

Метод 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
3
ответ дан 5 December 2019 в 20:13
поделиться

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

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
ответ дан 5 December 2019 в 20:13
поделиться

Один из методов -

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
0
ответ дан 5 December 2019 в 20:13
поделиться
Другие вопросы по тегам:

Похожие вопросы: