列表行讓我們考慮我有一個表「選項卡」具有列「上校」查詢:發現不屬於價值
表「選項卡」有這個數據 -
Col
1
2
3
4
5
如果我有一組值(2,3,6,7)。我可以通過起訴查詢
Select Col from Tab where col IN (2,3,6,7)
查詢存在於表中的值與列表但是,如果我想回到列表是不存在的,即只有在表中的值(6,7 ) 在這種情況下。我應該使用什麼查詢?
列表行讓我們考慮我有一個表「選項卡」具有列「上校」查詢:發現不屬於價值
表「選項卡」有這個數據 -
Col
1
2
3
4
5
如果我有一組值(2,3,6,7)。我可以通過起訴查詢
Select Col from Tab where col IN (2,3,6,7)
查詢存在於表中的值與列表但是,如果我想回到列表是不存在的,即只有在表中的值(6,7 ) 在這種情況下。我應該使用什麼查詢?
問題我相信是您試圖從聲明中找到您的值。你需要做的是把你的聲明變成一張表格,然後你可以確定哪些值是不同的。
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)
希望這有助於
一種方法是
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
一種方式是使用臨時表:
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)
一個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
+1使用最新技術 – Wade73 2010-07-08 12:46:37
你的數據庫中有[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
感謝您的答案。我沒有意識到這一點。但是,爲了簡單,我在這裏使用了一個例子。我其實正在處理varchar而不是數字。 – pavanred 2010-07-08 13:01:18
我認爲有很多方法可以實現這一目標,這裏是一個。
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)
遲到了......
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
順便說一句,如果你需要它礦山也給出了每個計數的,有用的。就好像你正在檢查一個產品清單,反對清單中的產品清單。雖然你可以更好地寫一個關鍵點,但是不知道我的頭頂有多大。
你在什麼RDBMS和版本? – 2010-07-08 13:03:39
在你已經附加到各種答案的註釋中,我看到你正在處理字符串值,而不是整數,並且你的輸入列表包含70個值附近的某處。你是否想寫一個存儲過程?使用動態生成的SQL?參數化查詢?正如Martin所問,您正在使用哪種數據庫平臺和版本?這將告訴我們我們必須使用哪些功能集。 (XML,UDF等)是Linq-> SQL的一個選項? – Toby 2010-07-08 13:44:35
@Martin我正在研究SQL Server 2005。 @Toby我只是想使用sql查詢來檢索滿足我在問題中提到的條件的行。 – pavanred 2010-07-08 17:19:33