我是一個非常初學者創建我的第一個專案,無法找到如何在一行中獲得結果的解決方案。
下面我粘貼了部分代碼:3個戰士(Monika,Pawel,Tomasz)2個styles_names(MT,K1),2個fight_level(AM,PRO_AM)。我懷疑我是否以正確的方式創建了這些表,并且我正在尋找一種更好的解決方案,該解決方案允許在一行中選擇所有資料(對于一名戰斗機)。我計劃將結果發送到 csv 檔案,因此與一臺戰斗機相關的所有資料必須排成一行,以便進一步排序。我將不勝感激有關如何解決它的建議。
CREATE TABLE fighters ( fighter_id INT PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY,fighter_name VARCHAR(20));
CREATE TABLE styles (style_id INT UNIQUE,fight_style_name VARCHAR(4),fight_level VARCHAR (8));
CREATE TABLE styles_preferred (fighter_id INT,style_id1 INT,style_id2 INT,style_id3 INT,style_id4 INT,FOREIGN KEY(fighter_id) REFERENCES fighters(fighter_id) ON DELETE SET NULL,FOREIGN KEY(style_id1) REFERENCES styles(style_id) ON DELETE SET NULL,FOREIGN KEY(style_id2) REFERENCES styles(style_id) ON DELETE SET NULL,FOREIGN KEY(style_id3) REFERENCES styles(style_id) ON DELETE SET NULL,FOREIGN KEY(style_id4) REFERENCES styles(style_id) ON DELETE SET NULL);
CREATE TABLE styles_optional (fighter_id INT,style_id1 INT,style_id2 INT,style_id3 INT,style_id4 INT,FOREIGN KEY(fighter_id) REFERENCES fighters(fighter_id) ON DELETE SET NULL,FOREIGN KEY(style_id1) REFERENCES styles(style_id) ON DELETE SET NULL,FOREIGN KEY(style_id2) REFERENCES styles(style_id) ON DELETE SET NULL,FOREIGN KEY(style_id3) REFERENCES styles(style_id) ON DELETE SET NULL,FOREIGN KEY(style_id4) REFERENCES styles(style_id) ON DELETE SET NULL);
INSERT INTO fighters (fighter_name) VALUES ('Monika'),('Pawe?'),('Tomasz);
INSERT INTO styles (style_id,fight_style_name,fight_level) VALUES(2001,'MT','AM'),(2002,'MT','PRO_AM'),(2003,'K1','AM'),(2004,'K1','PRO_AM');
INSERT INTO styles_preferred(fighter_id, style_id2, style_id4) VALUES(1, 2002,2004);
INSERT INTO styles_optional(fighter_id, style_id1 ) VALUES (1, 2001);
INSERT INTO styles_preferred(fighter_id, style_id3) VALUES (2, 2003);
INSERT INTO styles_optional(fighter_id, style_id1, style_id4) VALUES (2, 2001, 2004);
INSERT INTO styles_preferred(fighter_id, style_id1) VALUES (3, 2001);
SELECT (fighters.fighter_name, CONCAT (styles.fight_style_name, styles.fight_level))FROM fighters LEFT JOIN styles_preferred ON styles_preferred.fighter_id = fighters.fighter_id LEFT JOIN styles_optional ON styles_optional.fighter_id = fighters.fighter_id LEFT JOIN styles ON styles.style_id = styles_preferred .style_id2 OR styles.style_id = styles_preferred .style_id4 OR styles.style_id = styles_optional.style_id4 WHERE styles_preferred.style_id2 = 2002 OR styles_preferred.style_id4 = 2004 OR styles_optional. style_id4 = 2004;
這就是我所擁有的:
| 排 |
|---|
| (莫妮卡,MTPRO_AM) |
| (莫妮卡,K1PRO_AM) |
| (Pawe?,K1PRO_AM) |
這就是我想得到的:
| 排 |
|---|
| (莫妮卡,MTPRO_AM,K1PRO_AM) |
| (Pawe?,K1PRO_AM) |
uj5u.com熱心網友回復:
您的查詢幾乎就是您想要得到的。在連接樣式資料之后,您需要的是 string_agg。見演示。請注意,分隔符 (: 和 /) 是我添加的內容,而不是查詢會在沒有我指定的情況下生成的內容。
select (fighter_name, string_agg(styles, '/') )
from ( select
fighters.fighter_name
, CONCAT (
styles.fight_style_name
,':'
, styles.fight_level) styles
from fighters
left join styles_preferred on
styles_preferred.fighter_id = fighters.fighter_id
left join styles_optional on
styles_optional.fighter_id = fighters.fighter_id
left join styles on
styles.style_id = styles_preferred .style_id2
or styles.style_id = styles_preferred .style_id4
or styles.style_id = styles_optional.style_id4
where
styles_preferred.style_id2 = 2002
or styles_preferred.style_id4 = 2004
or styles_optional. style_id4 = 2004 ) fs
group by fighter_name;
旁注:您迫切需要格式化您的 SQL。您在一行中發布了 540 個字符的查詢,我當然希望這只是粘貼時的錯誤。那是因為需要如此多的正確滾動的查詢實際上是不可讀的。不幸的是,你的其他陳述也遭受了同樣的命運,只是沒有那么糟糕。上面的格式是由 DBeaver 的內置格式函式生成的。幾乎所有的 DB 介面都提供一個,使用它們。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/328559.html
標籤:PostgreSQL 关系型数据库
