Позволяет полагают, что у меня есть таблица '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) в этом случае. Какой запрос я должен использовать?
Я считаю, что проблема в том, что вы пытаетесь найти в заявлении ценности от вас. Что вам нужно сделать, так это превратить ваш оператор 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)
Надеюсь, это поможет
Я думаю, есть много способов добиться этого, вот один из них.
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)
одним из способов было бы использовать временную таблицу:
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)
У вас есть таблица [номеров] в вашей базе данных? (См. Почему мне следует рассмотреть возможность использования таблицы вспомогательных номеров? )
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
Метод 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
Поздно к вечеринке ...
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
Кстати, у меня также есть подсчет каждого, что полезно, если вам это нужно. Например, если вы сверяете список продуктов с тем, что у вас есть на складе. Хотя вы можете написать поворот для этого лучше, просто не знаю, как это из головы.
Один из методов -
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