2010-07-08 24 views
8

列表行讓我們考慮我有一個表「選項卡」具有列「上校」查詢:發現不屬於價值

表「選項卡」有這個數據 -

Col 
1 
2 
3 
4 
5 

如果我有一組值(2,3,6,7)。我可以通過起訴查詢

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

查詢存在於表中的值與列表但是,如果我想回到列表是不存在的,即只有在表中的值(6,7 ) 在這種情況下。我應該使用什麼查詢?

+0

你在什麼RDBMS和版本? – 2010-07-08 13:03:39

+0

在你已經附加到各種答案的註釋中,我看到你正在處理字符串值,而不是整數,並且你的輸入列表包含70個值附近的某處。你是否想寫一個存儲過程?使用動態生成的SQL?參數化查詢?正如Martin所問,您正在使用哪種數據庫平臺和版本?這將告訴我們我們必須使用哪些功能集。 (XML,UDF等)是Linq-> SQL的一個選項? – Toby 2010-07-08 13:44:35

+0

@Martin我正在研究SQL Server 2005。 @Toby我只是想使用sql查詢來檢索滿足我在問題中提到的條件的行。 – pavanred 2010-07-08 17:19:33

回答

3

問題我相信是您試圖從聲明中找到您的值。你需要做的是把你的聲明變成一張表格,然後你可以確定哪些值是不同的。

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) 

希望這有助於

+0

爲了簡單起見,我在這裏使用了一個示例。我其實正在處理大約70個值。編寫70個插入語句並不實際。我想知道是否有更簡單的方法來做到這一點。無論如何感謝您的答案。 – pavanred 2010-07-08 13:01:45

+0

你如何確定這些值? – Wade73 2010-07-08 13:37:06

+1

對不起,我在嘗試回答的後半部分之前添加了註釋,即創建表值函數以將逗號分隔的字符串轉換爲表格。 我試過了,現在它變得很簡單,一旦我把值列表放到表中。謝謝。 – pavanred 2010-07-08 17:13:39

0

一種方法是

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 
2

一種方式是使用臨時表:

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

+1爲竊取我的答案:) – Wade73 2010-07-08 12:45:58

+0

我在這裏使用了一個簡單的例子。我其實正在處理大約70個值。編寫70個插入語句並不實際。我想知道是否有更簡單的方法來做到這一點。 無論如何感謝您的答案。 – pavanred 2010-07-08 12:59:29

3

一個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 
+0

+1使用最新技術 – Wade73 2010-07-08 12:46:37

0

你的數據庫中有[numbers]表嗎? (請參閱Why should I consider using an auxiliary numbers table?

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

感謝您的答案。我沒有意識到這一點。但是,爲了簡單,我在這裏使用了一個例子。我其實正在處理varchar而不是數字。 – pavanred 2010-07-08 13:01:18

0

我認爲有很多方法可以實現這一目標,這裏是一個。

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

遲到了......

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 

順便說一句,如果你需要它礦山也給出了每個計數的,有用的。就好像你正在檢查一個產品清單,反對清單中的產品清單。雖然你可以更好地寫一個關鍵點,但是不知道我的頭頂有多大。