0

我有一张这样的表格;

位点、染色体、链。

这对位点和染色体应该是唯一的,而它们可以有多个链。在加载数据之前,我发现有些站点的染色体不止一个,这显然是一个错误。我试图找出错误,即多于 1 条染色体的位点。我已经考虑过了,但无法提出正确的 SQL。所以我把问题分开了。首先,我创建一个选择不同记录的表;

create table distinct_pair 
  as select distinct site, chromosome 
  from original_table;

然后我可以通过这个找到具有多个染色体的位点;

select site 
  from distinct_pair 
  group by site 
  having count(site)>1;

它工作得很好。然后尝试从原始表中查看错误的全部信息,我这样做了;

select * from original_table 
  where site 
  in (select name from distinct_pair
        group by site 
        having count(site)>1);

然后这个子查询太慢了,即使列都被索引了。

我试图将查询重写为连接,但这样做很困难。请帮我。

====================

感谢所有回答这个问题的人。我的数据看起来像这样。

Site | Chromosome | Strand
N111 | 2L         | +
N111 | 2L         | -
N112 | 2L         | +
N112 | 2L         | -
N112 | 3L         | +
N112 | 3L         | -
....

在这种情况下,N111 很好,但 N112 是错误的,因为它有两个染色体数据。由于链的原因,第二个答案的子查询选择了 N111 和 N112,这与我遇到的问题相同。具有多列的按功能分组的工作方式与我的猜测不同。但是,建议的答案给了我一个线索 group by 如何工作,以便我可以稍微修改它以使其工作。这两个答案给出了相同的结果。再次感谢各位。

地点

4

2 回答 2

0

看起来你想要这样的东西:

     SELECT site, chromosome, strand
       FROM original_table O
INNER JOIN (SELECT site, chromosome
            FROM original_table
            GROUP BY site, chromosome
            HAVING COUNT(*) > 1) T
         ON USING (site)
        AND USING (chromosome)

子查询选择重复多次的位点和染色体对,然后将其加入大表。由于它是一个 INNER JOIN,它只返回在子查询中匹配的行。

于 2010-11-26T00:19:07.417 回答
0

对于给定的站点,您可以只找到具有不同染色体的那个:

SELECT DISTINCT t1.site, t1.chromosome, t2.chromosome
FROM original_table t1
    INNER JOIN original_table t2 USING (site)
WHERE t1.chromosome <> t2.chromosome
于 2010-11-26T03:04:13.160 回答