У меня есть база данных материалов, которая разбита на две таблицы, A и B, каждая из которых содержит название материала, свойство и ссылку на свойство.Каждый материал может иметь несколько свойств и, следовательно, несколько ссылок.Затем я соединяю две таблицы по названию материала, в результате получается таблица со строкой на материал (и столбец для каждого свойства).
Проблема состоит в том, что я хотел бы объединить все ссылки дляданный материал в единый неповторяющийся список.Прямо сейчас у меня есть столбец с group_concat(distinct)
всех ссылок на материал из таблицы A и один столбец со всеми ссылками на материал из таблицы B. Я, естественно, могу вручную конкатенировать их references_A || ", " || references_B
, но это не избавляет от дубликатов,
Ниже приведен минимальный пример создания первой таблицы:
CREATE TABLE "attributes" (
"name",
"attribute",
"value",
"reference"
);
INSERT INTO "attributes" VALUES ('DAY', 'Si/Al ratio', '∞', 'XYZ');
INSERT INTO "attributes" VALUES ('NaY', 'Si/Al ratio', '2.4', 'XYZ');
Создание второй таблицы:
CREATE TABLE "properties" (
"name",
"Tmp",
"property",
"value",
"reference"
);
INSERT INTO "properties" VALUES ('DAY', 300, 'capacity', 5.36, 'XYZ');
INSERT INTO "properties" VALUES ('DAY', 320, 'capacity', 7.44, 'XYZ');
INSERT INTO "properties" VALUES ('NaY', 300, 'capacity', 6.8, 'ABC');
INSERT INTO "properties" VALUES ('NaY', 300, 'capacity', 9.4, 'ABC');
И создание комбинированного представления:
CREATE VIEW base AS SELECT
at.name,
pr.Tmp,
max(case when at.attribute = 'Si/Al ratio' then at.value end) `SiAl`,
avg(case when pr.property = 'capacity' then pr.value end) `capacity`,
group_concat(distinct pr.reference) `reference_pr`,
group_concat(distinct at.reference) `reference_at`
FROM attributes at
LEFT JOIN properties pr ON
at.name = pr.name
GROUP BY at.name, pr.Tmp
Почему я начинаю с двух таблиц, см. Мой предыдущий вопрос: https://stackoverflow.com/questions/8835443/sqlite-pivot-via-case-how-to-fill-down-a-column