2015-11-16 55 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