【问题标题】:How to select distinct in esql?如何在esql中选择不同的?
【发布时间】:2016-05-07 10:04:27
【问题描述】:

我在 esql (IBM Websphere Message Broker) 中有一个子流程,我需要在其中实现类似于 select distinct 功能的功能。

一些背景知识:我在 Oracle 数据库group_errcode_ref 中有一个表。该表几乎是ERROR_CODEID 的固定链接/映射。 ERROR_CODE 是唯一的,但 ID 可以重复。例如错误代码 4000 和 4001 都可以链接到 ID 1。

在我的 esql 子流中,我有一组错误代码,这些错误代码根据进入流的当前数据而变化。

所以我需要做的是我需要输入错误代码数组,并从我的表group_errcode_ref中为数组中的所有错误代码选择ID

我现在拥有的:

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 中执行此操作的最佳方法,但它不支持 distinctgroup by,或order by

【问题讨论】:

  • oracle 与 eSQL 和 IBM 产品有什么关系?
  • @xQbert 我正在使用通过 websphere MQ/esql 中的 ORA_ODBC 驱动程序访问的 Oracle 数据库。 array2 的查询正在访问 oracle 数据库 - 认为它可能是一个相关标签。
  • 是否支持group by
  • @agent5566 不,它不支持 group by/order by。我在想在选择之后必须有一些逻辑/排序来获得不同的 ID,但我不确定 esql 中的最佳方式。我想我会重新提出我的问题,因为我已经稍微更改了代码 - 以减少混乱。
  • 我不知道这个问题与 WebSphere MQ 有什么关系。 MQ 中没有 ESQL。你的意思是消息代理?如果是,建议您相应地标记以引起 MB 专家的注意 - 更有可能以这种方式得到答案。

标签: sql oracle messagebroker ibm-integration-bus extended-sql


【解决方案1】:

如果您使用的是 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, ...)

【讨论】:

    【解决方案2】:

    我的解决方法最终没有做选择不同或排序,而是另一种解决方法。

    基本上,我会遍历整个 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;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-04-30
      • 2012-03-20
      • 2021-04-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-29
      相关资源
      最近更新 更多