SQL 查询 (Pro*C) 如何能够找到 db 表中不存在的一组值

Posted

技术标签:

【中文标题】SQL 查询 (Pro*C) 如何能够找到 db 表中不存在的一组值【英文标题】:how does a SQL query (Pro*C) be able to find set of values that are not present in a db table 【发布时间】:2015-08-11 17:25:24 【问题描述】:

我在 proc(11.2+ 版本)中有一个带有嵌入式 Oracle SQL 调用的 C/C++ 程序。我有一个值列表(int)作为数组。我想通过 SQL 查询(作为 proc 代码)检查哪些值不在数据库表中。例如,假设我有值:10, 20, 30, 40, 50 存储在一个数组中,我的 DB 表 t1 的列 col1 具有 10, 20, 40。所以,

Select col1 from t1

将提供给我:

10
20
40

所以,我正在寻找排除值,即 30、50。 我可以通过嵌入式 Pro*C SQL 查询来做到这一点吗? 我的列表很大,数据库表有很多值。

【问题讨论】:

值列表从何而来?如果它们在数据库中,返回您想要的结果将是微不足道的。 您使用的是什么数据库?请适当地标记问题。 我正在使用 Oracle,我将在 Pro*C for Oracle 中将代码编写为嵌入式 SQL,我的 C/C++ 代码中有一组数字,我想检查非-存在于 Oracle 数据库表中 find the missing values from a set of values, using SQL的可能重复 【参考方案1】:

您需要在表格中设置您的值。这是适用于大多数数据库的典型方式:

with list as (
      select 10 as n union all select 20 union all select 30 union all
      select 40 union all select 50
     )
select l.*
from list l
where not exists (select 1 from t1 where col1 = l.n);

语法可能因数据库而异(from dual,子查询而不是 CTE),但思路是一样的。

【讨论】:

这很酷。但是,我的列表非常大,我将值列表作为 C/++ 数组,我正在尝试在 Pro*C for Oracle 中编写嵌入式 SQL。【参考方案2】:

在 Oracle 中,您可以使用集合作为使用联合查询创建 CTE/内联视图的替代方法:

select l.column_value as missing
from table(sys.odcinumberlist(10, 20, 30, 40, 50)) l
where not exists (select 1 from t1 where col1 = l.column_value);

   MISSING
----------
        20
        30
        50

SQL Fiddle.

这里的sys.odcinumberlist 是a built-in collection type,省去你创建自己的表类型的时间。

除了像这样(IMO)那样键入值稍微容易一些之外,您还可以通过将值作为数组传递来从客户端应用程序中使用这种方法,这可能很有用。有示例 here 用于 OCI (C/C++) 或 here 用于 Java。

【讨论】:

我可以使用包含值的C/C++数组吗,有很多值要检查,DB表也有很多值【参考方案3】:
SELECT regexp_substr('10|20|30|40|50', '[^|]+', 1, ROWNUM) var
FROM dual
CONNECT BY LEVEL <= length(regexp_replace('10|20|30|40|50', '[^|]', '')) + 1
MINUS
SELECT col1 FROM t1;

【讨论】:

我的列表非常大,从 C/C++ 代码中,这将是巨大的做一个 '10|20|...'

以上是关于SQL 查询 (Pro*C) 如何能够找到 db 表中不存在的一组值的主要内容,如果未能解决你的问题,请参考以下文章

Pro C 动态 SQL 查询

在db2中,如何使用sql查询最新七天的数据

没有找到能够从 AbstractJPAQuery 转换为 DTO 的转换器

csharp db2 sql查询使用c ## db2#c#

如何获取 XML 文件(存储在 SQL DB 中)的大小?

如何破解Adobe Acrobat9 pro?