查询和多个关系表 Postgresql



我是一个非常初学者创建我的第一个项目,无法找到如何在一行中获得结果的解决方案。

下面我粘贴了部分代码:3个战士(Monika,Pawel,Tomasz) 2个styles_names (MT,K1), 2个战斗级别(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;

这就是我得到的:

<表类>行tbody><<tr>(莫妮卡,MTPRO_AM)(莫妮卡K1PRO_AM)(Paweł,K1PRO_AM)

您的查询几乎您正在寻找得到的。在连接样式数据之后,您需要的是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内置的format函数生成的。几乎所有的DB接口都提供了一个,使用它们。

最新更新