2010-11-25 39 views
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,因爲這個鏈是我的問題。按功能分組的多列工作組與我所猜測的不同。然而,這個建議的答案給了我一個線索,讓我可以稍微修改它以使其工作。這兩個答案給出了相同的結果。 再次感謝你們。

網站

回答

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
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,它只返回在子查詢中有匹配的行。

+0

感謝。它也適用於一些修改。我應該更清楚地說出數據。這裏是修改後的MySQL版本。 (名稱)> 1的姓名,染色體從(選擇名稱,染色體from nature06929_s2 group by name,染色體)作爲T group by name; – microbe 2010-11-26 14:59:45

+0

我試圖解釋一些,但我不熟悉如何格式化我的意見。對不起... – microbe 2010-11-26 15:12:50