0

所以我得到了这个查询,它是从这样的表中提取的:

种植园表

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

所以问题是在查询中你可以看到红色出现了两次!我不能有这个,我不知道如何让连接发生,但阻止红色出现两次。

4

2 回答 2

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 中生成一个列表,这对最终用户来说很容易阅读;否则我永远不会想到您可能会询问此功能。希望这能回答你的问题,尽管我可能完全不在话下。

于 2012-04-04T23:06:22.473 回答
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)

免责声明:手写,预期语法错误:)

于 2012-04-04T18:47:06.840 回答