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