在相同组合的表子查询中

时间:2012-01-13 22:51:34

标签: subquery postgresql-9.0

我想从表中选择具有完全相同属性的组。例如,我的表格如下

facs_run_id |  fcj_id
    1       |     17
    1       |     4
    1       |     12
    2       |     17
    2       |     4
    2       |     12
    3       |     17
    3       |     12
    3       |     10

在此表中,每个facs_run_id都有fcj_id的不同组合,有些在facs_run_id个数字之间共享,而有些则不是。例如,以上facs_run_id 12相同,而3已共享fcj_id,但与1和{{1}不同}}。我想查询:

  1. 从特定2
  2. 收集所有fcj_id
  3. 找到具有完全相同facs_run_id组合的所有facs_run_id
  4. 在此,我想找到fcj_id组合中与facs_run_id相等的所有fcj_id,因此它应该返回facs_run_id: 1(或2& 1)。

    我可以找到遗漏某些2的人,甚至找不到哪个fcj_id

    fcj_id

    或者这个:

    SELECT facs_run_id 
    FROM   facs_panel 
    EXCEPT 
    SELECT fcj_id 
    FROM   facs_panel 
    WHERE  facs_run_id = 2;
    

    但我无法进行返回IDENTICAL SELECT row(fp.*, fcj.fcj_antigen, fcj.fcj_color) FROM facs_panel fp LEFT OUTER JOIN facs_conjugate_lookup fcj ON fcj.fcj_id = fp.fcj_id WHERE fp.fcj_id in ( SELECT fp.fcj_id FROM facs_panel fp WHERE fp.facs_run_id = 1); 的查询。我想这可以被认为是一种寻找聚合重复的方式,但我不知道该怎么做。任何建议或指针将非常感激(或者如果这种类型的查询不起作用,则创建表的更好方法)。

1 个答案:

答案 0 :(得分:0)

使用几个CTE非常容易:

with f1 as (select
                facs_run_id,
                array_agg(fcj_id) as flist
              from facs_panel
              group by facs_run_id),
     f2 as (select flist, count(*)
              from f1
              group by flist
              having count(*) > 1)
select f2.flist, f1. facs_run_id
  from f2
  join f1 on (f2.flist = f1.flist)
  order by flist, facs_run_id;

通过此查询运行的问题数据会产生:

   flist   | facs_run_id 
-----------+-------------
 {4,12,17} |           1
 {4,12,17} |           2
(2 rows)