2016-08-03 90 views
2

让我们假设可用值简单表找出哪些是不表

Col1 
====== 
one 
two 

让我们假设下面的简单查询

Select count(*) from TABLE_A where Col1 in ('one','two','three','four') 

在上面的查询会产生以下结果

2 

现在我想知道IN_条件中哪些值在table_A中不可用。

如何找出表中不可用的值?

像下面结果

three 
four 

以上查询唯一的例子。在我的实时查询中IN-Condition中有1000个值。

工作数据库:DB2

+0

如果1000个值'IN'条件,那么,你可以添加一个表中并存储所有1000条记录。然后使用'LEFT JOIN'和'NULL'检查你可以很容易找到不匹配的记录 – Arulkumar

+0

@Arulkumar。我已经知道这种方法了。我需要解决任何其他方法。 –

+0

可能是VALUES()的规范的语法替代方法足够作为_any other_方法吗?当这个谓词是[或有效的;我无法测试非选择子查询语法] Col1 in(values('one'),('two'),('three'),('four'))',那么相同的语法可以用在EXCEPT查询[或EXCEPTION JOIN对已经提出的LEFT JOIN的类似影响]。 – CRPence

回答

3

这是工作的周围,实现您的期望之一。

而不是硬编码IN条件中的值,您可以将这些值移动到一个表中。如果仅使用LEFT JOINNULL检查,则可以获得不匹配的值。

SELECT MR.Col1 
FROM MatchingRecords MR -- here MatchingRecords table contains the IN condition values 
LEFT JOIN Table_A TA ON TA.Col1 = MR.Col1 
WHERE TA.Col1 IS NULL; 

Working DEMO

-1

如果值在语句字符串上市,而不是存储在表中,被用于目前正在由值列表,然后也许是修订的语法[显然,来自IN谓词的其他输入可能会受到影响?以下修改的值列表语法既可以用于原始聚合查询[下面显示的两个查询中的第一个],也可以用于查询如何操作代码的查询[第二个下面两个查询]:

Select count(*) 
from TABLE_A 
where Col1 in (values('one'),('two'),('three'),('four')) 
; -- report from above query follows: 
COUNT (*) 
      2 


[BGN-编辑05 - 8 - 2016:将这个文本和例子仅低于]
显然至少一个DB2变体不太愿意在派生表未命名列,所以查询就在列的下方;我选择了COL1,以便与实际TABLE中的名称相匹配,但这不应该是必需的。将(col1)添加到原始查询中,该查询仍保留在原始的预编辑版本中;该版本仍然是这个编辑\插入后缺少(col1)这里补充:

select * 
from (values('one'),('two'),('three'),('four')) as x (col1) 
except (select * from table_a) 
; -- report from above query follows: 
COL1 
three 
four 


以下是给原来的查询,当一些不成文的DB2运行所注释下方显示一个未命名列发生故障变体;我应该指出,这个SQL查询功能,没有错误,在DB2 for我7.1
[最终编辑05 - 8-2016]

select * 
from (values('one'),('two'),('three'),('four')) as x 
except (select * from table_a) 
; -- report from above query follows: 
VALUES 
three 
four 
+0

您的查询出现错误,如“没有为'x'的列1指定列名称”。 @CRPence –

+0

使用IBM i 7.1在IBM DB2 for i SQL上显示的功能没有错误然而,为派生表命名列的语法是遵循AS标识符的括号列列表。我将编辑答案以包含该内容 – CRPence