I have a database structure in PostgreSQL that looks something like this:
DROP TABLE IF EXISTS medium CASCADE;
DROP TABLE IF EXISTS works CASCADE;
DROP DOMAIN IF EXISTS nameVal CASCADE;
DROP DOMAIN IF EXISTS numID CASCADE;
DROP DOMAIN IF EXISTS alphaID CASCADE;
CREATE DOMAIN alphaID AS VARCHAR(10);
CREATE DOMAIN numID AS INT;
CREATE DOMAIN nameVal AS VARCHAR(40);
CREATE TABLE works (
w_alphaID alphaID NOT NULL,
w_numID numID NOT NULL,
w_title nameVal NOT NULL,
PRIMARY KEY(w_alphaID,w_numID));
CREATE TABLE medium (
m_alphaID alphaID NOT NULL,
m_numID numID NOT NULL,
m_title nameVal NOT NULL,
FOREIGN KEY(m_alphaID,m_numID) REFERENCES
works ON UPDATE CASCADE ON DELETE CASCADE);
INSERT INTO works VALUES('AB',1,'Sunset'),
('CD',2,'Beach'),
('EF',3,'Flower');
INSERT INTO medium VALUES('AB',1,'Wood'),
('AB',1,'Oil'),
('CD',2,'Canvas'),
('CD',2,'Oil'),
('CD',2,'Bronze'),
('EF',3,'Paper'),
('EF',3,'Pencil');
SELECT * FROM works;
SELECT * FROM medium;
SELECT w_alphaID AS alphaID, w_numID AS numID, w_title AS
Name_of_work, m_title AS Material_used
FROM works, medium WHERE
works.w_alphaID = medium.m_alphaID
AND works.w_numID = medium.m_numID;
The output looks something like this:
w_alphaid | w_numid | w_title
-----------+---------+---------
AB | 1 | Sunset
CD | 2 | Beach
EF | 3 | Flower
(3 rows)
m_alphaid | m_numid | m_title
-----------+---------+---------
AB | 1 | Wood
AB | 1 | Oil
CD | 2 | Canvas
CD | 2 | Oil
CD | 2 | Bronze
EF | 3 | Paper
EF | 3 | Pencil
(7 rows)
alphaid | numid | name_of_work | material_used
---------+-------+--------------+---------------
AB | 1 | Sunset | Wood
AB | 1 | Sunset | Oil
CD | 2 | Beach | Canvas
CD | 2 | Beach | Oil
CD | 2 | Beach | Bronze
EF | 3 | Flower | Paper
EF | 3 | Flower | Pencil
(7 rows)
Now my question is what query should I use to have the format of the last SELECT
statement to look something like this:
alphaid | numid | name_of_work | material_used_1 | material_used_2 | material_used_3
---------+-------+--------------+-----------------+-----------------+---------------
AB | 1 | Sunset | Wood | Oil |
CD | 2 | Beach | Canvas | Oil | Bronze
EF | 3 | Flower | Paper | Pencil |
(3 rows)
I looked into using string_agg()
but that puts the values into one cell but I am looking to have a separate cell for each value. I tried using join to see if I can achieve such output but with no success so far. I appreciate you taking the time to look at this question.