假设遵循简单表
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 :(得分:3)
这是实现您期望的工作之一。
您可以将这些值移到表中,而不是对IN
条件中的值进行硬编码。如果仅使用LEFT JOIN
进行NULL
检查,则可以获得不匹配的值。
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;
答案 1 :(得分:-1)
如果值要在语句字符串中列出而不是存储在表中,那么可能是对当前正在组合的值列表使用的语法的修订[显然,来自除TABLE之外的其他输入] IN谓词可以实现吗?以下针对值列表的修订语法既可以用于原始聚合查询[在下面显示为两个查询中的第一个],也可以用于询问方法代码的查询[第二个下面两个问题]:
Select count(*)
from TABLE_A
where Col1 in ( values('one'),('two'),('three'),('four') )
; -- report from above query follows:
COUNT ( * )
2
[Bgn-Edit 2016年8月5日:在下面添加此文本和示例]
显然,至少有一个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 i 7.1上运行时没有错误
[结束编辑2016年8月5日]
select *
from ( values('one'),('two'),('three'),('four') ) as x
except ( select * from table_a )
; -- report from above query follows:
VALUES
three
four