Покажите связь "один ко многим" уникальной строкой на 2 столбца - 1 (идентификатор и список разделенных запятой значений)

Начиная с Python 3.6 вы можете использовать f-строки. https://www.python.org/dev/peps/pep-0498/

head = csv.reader(open(f'{sys.argv[1]}.csv'))

.

6
задан Community 23 May 2017 в 12:25
поделиться

4 ответа

Я полагаю, что ответ, в котором Вы нуждаетесь, является пользовательским агрегатом, подобным этому:

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);

Учитывая таблицу элементов (названный элементами) со столбцом назвал имя, содержащее (странно достаточно) имя элемента и другой столбец названный 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

Дополнительный набор данных был добавлен, чтобы протестировать, вставляют ли последовательность, влиял на результат; это, кажется, не делает так (коды находятся в отсортированном порядке; я не уверен, существует ли способ измениться - реверс - тот порядок).


Примечания:

  1. Этот агрегат должен быть применимым для любого типа, который может быть преобразован в VARCHAR (255), что означает любой числовой или временный тип. Длинные столбцы CHAR и типы блоба (БАЙТ, ТЕКСТ, BLOB, CLOB) не обрабатываются.
  2. Простой LVARCHAR ограничивает совокупный размер 2 048 байтами. Если Вы думаете, что нуждаетесь в более долгих длинах, указываете LVARCHAR(10240) (для 10 кибибайт), например.
  3. С Informix 12.10. FC5, максимальная длина, которая работы, кажется, 16380; что-либо дольше, кажется, инициировало SQL -528: Maximum output rowsize (32767) exceeded, который удивляет меня.
  4. Если необходимо удалить агрегат, можно использовать:

    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;
    
19
ответ дан 8 December 2019 в 05:58
поделиться

Я не уверен в informix sql, но в MSSQL или Oracle, Вы могли сделать это с

ДЕКОДИРУЙТЕ или ключевые слова СЛУЧАЯ путем конкатенации их вместе. Однако это потребовало бы, чтобы Вы знали все потенциальные ценности заранее, который является хрупким.

Я принимаю причину, Вам не нравится ключевое слово МАТЕРИАЛА, то, потому что informix не поддерживает его?

Oracle также поддерживает ПОДКЛЮЧЕНИЕ ключевыми словами, которые работали бы, но снова не могут поддерживаться informix.

Вероятно, лучший ответ должен был бы создать этот вывод в Вашем слое клиента/данных после запроса. Существует ли конкретная причина, почему это должно быть сделано в запросе?

1
ответ дан 8 December 2019 в 05:58
поделиться

Кроме того, если informix позволяет Вам создавать функции пользователя, Вы могли бы создать функцию, которая возвратила строку со связанным значением.

1
ответ дан 8 December 2019 в 05:58
поделиться

Я хотел бы указать на Вас, это отвечает на другой подобный вопрос на Переполнении стека. Вы ищете что-то как MySQL group_concat() функция.

0
ответ дан 8 December 2019 в 05:58
поделиться
Другие вопросы по тегам:

Похожие вопросы: