В моей базе данных есть следующая схема:
CREATE TABLE survey_results (
id integer NOT NULL
);
CREATE TABLE slide_results (
id integer NOT NULL,
survey_result_id integer,
tags character varying[] DEFAULT '{}'::character varying[],
content character varying,
created_at timestamp with time zone NOT NULL
);
INSERT INTO survey_results (id)
VALUES (1);
INSERT INTO slide_results (id, survey_result_id, tags, content, created_at)
VALUES (1, 1, '{food}', 'Food slide', now());
INSERT INTO slide_results (id, survey_result_id, tags, content, created_at)
VALUES (2, 1, '{motivation}', 'Motivation slide', now());
Теперь я хочу получить SQL-запрос, который будет возвращать идентификатор результата опроса и контент для результатов слайдов с указанными тегами.Я написал что-то вроде этого:
select distinct on(sr.id)
sr.id,
slr.content AS food,
slr2.content AS motivation
from survey_results sr
LEFT JOIN slide_results slr ON slr.survey_result_id = sr.id AND slr.id IN (
SELECT id as id
FROM slide_results
WHERE 'food' = ANY(tags)
ORDER BY created_at desc
)
LEFT JOIN slide_results slr2 ON slr2.survey_result_id = sr.id AND slr2.id IN (
SELECT id as id
FROM slide_results
WHERE 'motivation' = ANY(tags)
ORDER BY created_at desc
)
group by slr.content, slr2.content, sr.id
, который возвращает:
| id | food | motivation |
| --- | ---------- | ---------------- |
| 1 | Food slide | Motivation slide |
Этот запрос работает нормально, но мне интересно, есть ли лучший способ сделать это?
РЕДАКТИРОВАТЬ:
Я забыл добавить ссылку сделать db-fiddle:
https://www.db -fiddle.com / f / gP761psywgmovfdTT7DjP4 / 0