我在esql(IBM Websphere Message Broker)中有一个子流,我需要实现类似于select distinct
功能的东西。
一些背景知识:我在Oracle数据库group_errcode_ref
中有一个表。此表几乎是ERROR_CODE
和ID
的固定链接/映射。 ERROR_CODE
是唯一的,但ID
可以重复。例如,错误代码4000和4001都可以链接到ID 1。
在我的esql子流程中,我有一组错误代码,这些代码会根据流入的当前数据而有所不同。
所以我需要做的是我需要输入输入错误代码数组,并从我的表ID
group_errcode_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
是输入的错误代码数组。 row
是包含与错误代码对应的所有ID的数组。
这很好,但我想删除db.rows[]
数组中的重复项。
我不确定在esql中执行此操作的最佳方法,但它不支持distinct
。 group by
或order by
答案 0 :(得分:2)
如果您使用的是PASSTHRU语句,则支持数据库管理器的所有功能,因此也是如此。
您唯一需要克服的是您无法在PASSTHRU中直接混合数据库和消息树查询,您传递给它的所有内容都将直接转到数据库。
所以你的原始解决方案看起来像这样:
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,...)
答案 1 :(得分:0)
我的工作最终没有选择明确的选择或排序,而是另一种解决方法。
基本上我遍历ERROR_CODE的整个数组,然后我查询与error_code对应的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;