代码之家  ›  专栏  ›  技术社区  ›  Aravind S

PostgreSQL:只从包含多行的结果中获取一条记录

  •  1
  • Aravind S  · 技术社区  · 7 年前

     SELECT t.taskid AS id,
        t.projectid AS project,
        te.effort AS effort,
        (((t.taskname::text || ' | '::text) || m.milestonename::text) || ' | '::text) || p.projectname::text AS name,
        t.status,
        1 AS version
       FROM task t
         LEFT JOIN timeentry te ON t.taskid = te.taskid
         LEFT JOIN project p ON t.projectid = p.projectid
         LEFT JOIN milestonetask tm ON t.taskid = tm.taskid
         FULL JOIN milestone m ON tm.milestoneid = m.milestoneid
      WHERE m.milestoneid IS NOT NULL
    UNION
     SELECT distinct(t.taskid) AS id,
        t.projectid AS project,
        te.effort AS effort,
        (t.taskname::text || ' | (--no milestone--) | '::text) || p.projectname::text AS name,
        t.status,
        1 AS version
      FROM task t 
         LEFT JOIN timeentry te ON t.taskid = te.taskid
         LEFT JOIN project p ON t.projectid = p.projectid
         LEFT JOIN milestonetask tm ON t.taskid = tm.taskid
         FULL JOIN milestone m ON tm.milestoneid = m.milestoneid
      WHERE NOT (tm.taskid IN ( SELECT DISTINCT milestonetask.taskid
               FROM milestonetask
              WHERE milestonetask.milestoneid IS NOT NULL));
    

    id | project | effort |        name       | status | version 
    ----+---------+--------+------------------+--------+---------
     89 |       1 |      5 | Coding for clock | Active |       1
     89 |       1 |      2 | Coding for clock | Active |       1
     89 |       1 |      4 | Coding for clock | Active |       1
    

    请告诉我,如果我足够清楚,将非常感谢您的帮助和提前感谢。

    2 回复  |  直到 7 年前
        1
  •  1
  •   Gordon Linoff    7 年前

    distinct on

    with t as (
          <your query here>
         )
    select distinct on (id) t.*
    from t
    order by id;
    
        2
  •  0
  •   Philipp T.    7 年前

    把整个查询包装成

    SELECT DISTINCT(id), * FROM (
    <your query>
    ) subquery;