如何在esql中选择distinct?
我在esql(ibmwebspheremessagebroker)中有一个子流,在这里我需要实现类似于如何在esql中选择distinct?,sql,oracle,messagebroker,ibm-integration-bus,extended-sql,Sql,Oracle,Messagebroker,Ibm Integration Bus,Extended Sql,我在esql(ibmwebspheremessagebroker)中有一个子流,在这里我需要实现类似于selectdistinct的功能 一些背景:我在Oracle数据库中有一个表group\u errcode\u ref。此表几乎是ERROR\u code和ID的固定链接/映射错误\u代码是唯一的,但是ID可以复制。例如,错误代码4000和4001都可以链接到ID 1 在esql子流中,我有一组错误代码,这些错误代码根据流入流的当前数据而变化 因此,我需要做的是获取输入错误代码数组,并从我的表
selectdistinct
的功能
一些背景:我在Oracle数据库中有一个表group\u errcode\u ref
。此表几乎是ERROR\u code
和ID
的固定链接/映射<代码>错误\u代码是唯一的,但是ID
可以复制。例如,错误代码4000和4001都可以链接到ID 1
在esql子流中,我有一组错误代码,这些错误代码根据流入流的当前数据而变化
因此,我需要做的是获取输入错误代码数组,并从我的表group\u errcode\u ref
我现在所拥有的:
declare db rows;
set db.rows[] = (select d.ID from Database.group_errcode_ref as d where d.ERROR_CODE in (select D from errCodes.Code[] as D);
errCodes
是来自输入的错误代码数组<代码>行是与错误代码对应的所有ID的数组
这很好,但我想从db.rows[]
数组中删除重复项
我不确定在esql中实现这一点的最佳方法,但它不支持
distinct
<代码>分组依据,或排序依据
我的解决方案最终没有执行“选择不同”或排序,而是执行了另一个解决方案
基本上,我遍历整个错误代码数组,然后查询与错误代码对应的ID,然后在插入它们的表中选择count(*)
这只适用于我的特定应用程序,因为我插入了ID/问题对
基本上它看起来像:
for x as errs.Error[] do
declare db row;
set db.rows[] = passthru('select ID from my_static_map_table where error_code = ?;' values(x.Code));
declare db2 row;
set db2.rows[] = passthru('select count(*) from my_table_2 where guid = ? and id = ?;' values(guid, db.ID));
if db2.COUNT == 0 then
-- Here I do an insert into my_table_2 with ID and a few other values
end if;
end for;
这不是一个正确的答案,但它适用于我的特定应用程序。基本上,循环遍历每个错误代码并一次选择一个,而不是发送整个数组。然后插入另一个数据库,同时避免另一个选择重复,以查看是否已插入该数据库
我还是会等一个星期,看看有没有更好的答案,然后接受这个答案
更新 我已经修改了代码以匹配Attila的解决方案——这比我原来想要的要好得多 我唯一要添加的是设置错误代码格式的函数-这非常简单:
create function FlattenErrorCodesArray(in err row) returns char begin
declare idx int 1;
declare ret char;
for x as errs.Error[] do
if idx = 1 then
set ret = '(' || cast(x.Code as char);
else
set ret = ret || ',' || cast(x.Code as char);
end if;
set idx = idx + 1;
end for;
set ret = ret || ')';
end;
如果您使用的是PASSTHRU语句,那么您的数据库管理器的所有功能都是受支持的,而且非常独特 唯一需要克服的是,不能在PASSTHRU中直接混合使用数据库和messagetree查询,传递给它的所有内容都直接传递给数据库 因此,您的原始解决方案将如下所示:
set db.rows[] = PASSTHRU 'select distinct d.ID from SCHEMA.group_errcode_ref as d where d.ERROR_CODE in ' || getErrorCodesFromInput(errCodes) TO Database.DSN1;
这里getErrorCodesFromInput是一个返回字符的函数,其中包含输入中的错误代码,为查询正确格式化,例如(ec1、ec2…)oracle与IBM产品eSQL有什么关系?@xQbert我使用的是通过websphere MQ/eSQL中的ORA_ODBC驱动程序访问的oracle数据库。array2的查询正在访问oracle数据库-可能是相关的标记。它是否支持
分组依据
?@agent5566否它不支持分组依据/订单依据。我认为在选择之后,必须有一些逻辑/排序来获得不同的ID,但我不确定esql中的最佳方法。我想我会重新解释一下我的问题,因为我已经稍微修改了代码,以减少混淆。我不知道这个问题中有什么与WebSphere MQ相关。MQ中没有ESQL。你是说消息代理吗?如果是,建议您相应地添加标签,以引起MB专家的注意,这样更有可能得到答案。