重写子查询有加入的子句吗?

时间:2010-11-25 23:55:42

标签: mysql join subquery having-clause

我有一个包含这样的列的表格;

位点,染色体,链。

这对位点和染色体应该是唯一的,而它们可以有多个链。 在加载数据之前,我发现有些网站有一条以上的染色体,这显然是一个错误。我试图找出错误,这是一个有超过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因为链,这与我遇到的问题相同。具有多列的功能组与我猜测的不同。然而,建议的答案给了我一个线索如何工作,以便我可以稍微修改它以使其工作。这两个答案给出了相同的结果。 再次感谢,你们。

网站

2 个答案:

答案 0 :(得分: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,它只返回子查询中匹配的行。

答案 1 :(得分: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