如何在esql中选择distinct?

如何在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子流中,我有一组错误代码,这些错误代码根据流入流的当前数据而变化 因此,我需要做的是获取输入错误代码数组,并从我的表

我在esql(ibmwebspheremessagebroker)中有一个子流,在这里我需要实现类似于
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专家的注意,这样更有可能得到答案。