2015-11-16 88 views
1

我有一個VBA內建的用戶表單,我的同事可以輸入多個值來構建一個數組,並將它放入一個IN語句中,這很好。問題是我需要也能夠顯示錶中不存在的值。SQL - 從數組中選擇,而不是在相同的查詢

例表

id | value 
1 | value1 
2 | value2 
4 | value4 

那麼就可能會產生的查詢是

SELECT [id],[value] FROM [tablea] WHERE [id] IN (1,2,3,4) 

預期或希望的結果會是如下

id | value 
1 | value1 
2 | value2 
3 | null 
4 | value4 

我試着這樣做像這樣;

SELECT [id],[value] FROM [tablea] WHERE [id] IN (1,2,3,4) AND [id] NOT IN (1,2,3,4) 

因爲兩個數組都是相同的,當然返回0。

我知道我可以用一個聯合來做到這一點,並且在第二個聯合中定義不在聲明中,但是我想在沒有聯合的情況下做到這一點..任何其他想法?

這是微軟SQL 2005

可惜我只能訪問選擇,因爲我執行或者通過VBA或查詢的Tableau。所以我不能創建一個派生表或者除了select語句之外還有其他的引用。

+0

如果你正在構建一個數組,這樣做,我有一個很強烈的懷疑你的代碼是容易受到SQL注入。你是否建立了一個包含這個數組的字符串,然後在你的數據庫中執行它?這是sql注入的教科書定義。 –

+0

@SeanLange我同意。但是,腳本只能在Active Directory中運行,並且只有選擇權限,並且可以選擇用戶。 –

+0

@SeanLange雖然我在這裏學習,但你會有什麼建議? –

回答

4

您需要某種left join。一種方法是構建您的查詢爲:

select v.id, t.value 
from (values (1), (2), (3), (4) 
    ) v(id) left join 
    table t 
    on v.id = t.id; 
+0

呵呵。我不知道你可以使用這樣的'values'子句。每天學些新東西。 –

+2

@JoelCoehoorn這是一個表值構造器。這種類型的東西非常方便。 :) https://msdn.microsoft.com/en-us/library/dd776382.aspx –

+0

確實。我不得不建議在外連接之前生成一個「數字」表來過濾他的輸入集。它在這裏工作,但想象一下,如果這些是字符串值;我真的會遇到麻煩。 –

0

由於喬爾Coehoorn的尖端朝使用CTE

我能做到這一點,像這樣;

WITH numbers AS (
    SELECT 1 AS num UNION ALL 
    SELECT 2 AS num UNION ALL 
    SELECT 3 AS num UNION ALL 
    SELECT 4 as num UNION ALL) 

SELECT 
    COALESCE(id,num) as col1, 
    id as col2 
FROM tablea 

RIGHT JOIN numbers ON tablea.id = numbers.num 

這將返回

col1 | col2 
1  | 1 
2  | 2 
3  | NULL 
4  | 4