当前位置:  开发笔记 > 数据库 > 正文

显示一对多关系为2列 - 1个唯一行(ID和逗号分隔列表)

如何解决《显示一对多关系为2列-1个唯一行(ID和逗号分隔列表)》经验,为你挑选了1个好方法。

我需要类似于这两个SO问题,但使用Informix SQL语法.

使用SQL将多个字段连接成一个字段

SQL帮助:选择语句连接一对多关系

我的数据如下:

id     codes

63592  PELL
58640  SUBL
58640  USBL
73571  PELL
73571  USBL
73571  SUBL

我希望看到它像这样回来:

id     codes 

63592  PELL
58640  SUBL, USBL
73571  PELL, USBL, SUBL

另请参见Informix中的group_concat().



1> Jonathan Lef..:

我相信你需要的答案是用户定义的聚合,类似于这个:

CREATE FUNCTION gc_init(dummy VARCHAR(255)) RETURNING LVARCHAR;
    RETURN '';
END FUNCTION;

CREATE FUNCTION gc_iter(result LVARCHAR, value VARCHAR(255))
    RETURNING LVARCHAR;
    IF result = '' THEN
        RETURN TRIM(value);
    ELSE
        RETURN result || ',' || TRIM(value);
    END IF;
END FUNCTION;

CREATE FUNCTION gc_comb(partial1 LVARCHAR, partial2 LVARCHAR)
    RETURNING LVARCHAR;
    IF partial1 IS NULL OR partial1 = '' THEN
        RETURN partial2;
    ELIF partial2 IS NULL OR partial2 = '' THEN
        RETURN partial1;
    ELSE
        RETURN partial1 || ',' || partial2;
    END IF;
END FUNCTION;

CREATE FUNCTION gc_fini(final LVARCHAR) RETURNING LVARCHAR;
    RETURN final;
END FUNCTION;

CREATE AGGREGATE group_concat
    WITH (INIT = gc_init, ITER = gc_iter,
          COMBINE = gc_comb, FINAL = gc_fini);

给定一个元素表(称为元素),其中一个名为name的列包含(有趣的是)元素名称,另一列名为atomic_number,此查询产生以下结果:

SELECT group_concat(name) FROM elements WHERE atomic_number < 10;

Hydrogen,Helium,Lithium,Beryllium,Boron,Carbon,Nitrogen,Oxygen,Fluorine

应用于该问题,您应该从以下方面获得所需的答案:

SELECT id, group_concat(codes)
    FROM anonymous_table
    GROUP BY id;

CREATE TEMP TABLE anonymous_table
(
    id      INTEGER NOT NULL,
    codes   CHAR(4) NOT NULL,
    PRIMARY KEY (id, codes)
);

INSERT INTO anonymous_table VALUES(63592, 'PELL');
INSERT INTO anonymous_table VALUES(58640, 'SUBL');
INSERT INTO anonymous_table VALUES(58640, 'USBL');
INSERT INTO anonymous_table VALUES(73571, 'PELL');
INSERT INTO anonymous_table VALUES(73571, 'USBL');
INSERT INTO anonymous_table VALUES(73571, 'SUBL');
INSERT INTO anonymous_table VALUES(73572, 'USBL');
INSERT INTO anonymous_table VALUES(73572, 'PELL');
INSERT INTO anonymous_table VALUES(73572, 'SUBL');

SELECT id, group_concat(codes)
    FROM anonymous_table
    GROUP BY id
    ORDER BY id;

那个输出是:

58640 SUBL,USBL
63592 PELL
73571 PELL,SUBL,USBL
73572 PELL,SUBL,USBL

添加额外的数据集以测试插入序列是否影响结果; 它似乎没有这样做(代码按排序顺序;我不确定是否有办法改变 - 反向 - 该顺序).


笔记:

    此聚合应该可用于任何可以转换为VARCHAR(255)的类型,这意味着任何数字或时间类型.不处理长CHAR列和blob类型(BYTE,TEXT,BLOB,CLOB).

    普通的LVARCHAR将聚合大小限制为2048字节.如果您认为需要更长的长度,请指定LVARCHAR(10240)(例如10 KiB).

    从Informix 12.10.FC5开始,最大工作长度似乎是16380; 任何更长的东西似乎都会触发SQL -528: Maximum output rowsize (32767) exceeded,这让我感到惊讶.

    如果需要删除聚合,可以使用:

    DROP AGGREGATE IF EXISTS group_concat;
    DROP FUNCTION IF EXISTS gc_fini;
    DROP FUNCTION IF EXISTS gc_init;
    DROP FUNCTION IF EXISTS gc_iter;
    DROP FUNCTION IF EXISTS gc_comb;
    

推荐阅读
李桂平2402851397
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有