您似乎很可能在问如何对指示进行分组——也就是说,仅在该组的第一行显示一个标识或描述该组的值。在这种情况下,您想使用 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 中生成一个列表,这对最终用户来说很容易阅读;否则我永远不会想到您可能会询问此功能。希望这能回答你的问题,尽管我可能完全不在话下。