所以我得到了这个查询,它从这样的表中拉出来:
种植园表
PLANT ID, Color Description
1 Red
2 Green
3 Purple
蔬菜桌
VegetabkeID, PLANT ID, Feeldesc
199 1 Harsh
200 1 Sticky
201 2 Bitter
202 3 Bland
现在在我的查询中我使用PLANT ID加入他们(我使用左连接)
PLANT ID, Color Description, Feeldesc
1 Red Harsh
1 Red Sticky
2 Green Bitter
3 Purple Bland
所以问题是在查询中你可以看到Red出现两次!我不能拥有这个,而且 我不确定如何使连接发生,但阻止红色出现两次。
答案 0 :(得分:1)
您似乎很可能会询问如何分组指示 - 也就是说,显示仅在该组的第一行上标识或描述组的值。在这种情况下,您希望使用lag()窗口函数。
假设架构和数据的设置如下:
create table plant (plantId int not null primary key, color text not null);
create table vegetable (vegetableId int not null, plantId int not null,
Feeldesc text not null, primary key (vegetableId, plantId));
insert into plant values (1,'Red'),(2,'Green'),(3,'Purple');
insert into vegetable values (199,1,'Harsh'),(200,1,'Sticky'),
(201,2,'Bitter'),(202,3,'Bland');
您可以使用此简单查询获得显示的结果(模数列标题):
select p.plantId, p.color, v.Feeldesc
from plant p left join vegetable v using (plantId)
order by plantId, vegetableId;
如果您希望在第一行之后禁止显示重复信息,则此查询将执行此操作:
select
case when plantId = lag(plantId) over w then null
else plantId end as plantId,
case when p.color = lag(p.color) over w then null
else p.color end as color,
v.Feeldesc
from plant p left join vegetable v using (plantId)
window w as (partition by plantId order by vegetableId);
结果如下:
plantid | color | feeldesc
---------+--------+----------
1 | Red | Harsh
| | Sticky
2 | Green | Bitter
3 | Purple | Bland
(4 rows)
本周我不得不做类似上面的事情来直接从psql中生成一个列表,这对于最终用户来说很容易阅读;否则你永远不会想到你可能会问这个功能。希望这能回答你的问题,尽管我可能完全偏离基础。
答案 1 :(得分:0)
检查文档中的array_agg函数,可以使用以下内容:
SELECT
v.plantId
,v.color
,array_to_string(array_agg(v.Feeldesc),', ')
FROM
vegetable
INNER JOIN plant USING (plantId)
GROUP BY
v.plantId
,v.color
或使用
SELECT DISTINCT
v.plantId
,v.color
FROM
vegetable
INNER JOIN plant USING (plantId)
免责声明:手写,预期语法错误:)