2017-01-18 7 views
1

私はSQLクエリを書く方法がわかりません。難しいSQLクエリすべてとすべての場合

考えるデータ:
いくつかの形質識別子の整数は - 私は特定の形質に割り当てられているSNPを見つけるするなdomain_idを探しています1、447

としましょう。 SNPは、genomic_posがドメインstartendとの間にあり、chr_idが同じドメインの場合はドメインにあります。 2例の任意すべてがあります

  • 私はすべての与えられた特性からのSNPを見つけることが可能なドメインを探しているすべての場合。言い換えれば、すべての形質はドメイン内にsnp表現を持っています。
  • 任意ケース私は特定のドメインからsnpsを見つけることができるドメインを探しています。つまり、ドメイン内の任意の特性のsnp表現を1つだけ見つけるだけで十分です。

私はすでにどの場合を解決してきましたが、私はですべてケースを立ち往生:(

ここは、任意のコードです:ここでは

SELECT DISTINCT domains.domain_id 
FROM snps JOIN traits_snps ON snps.snp_id  = traits_snps.snp_id 
     JOIN traits  ON traits.trait_id = traits_snps.trait_id 
     JOIN chromosomes ON snps.chr_id  = chromosomes.chr_id 
     JOIN domains  ON domains.chr_id = chromosomes.chr_id 
WHERE traits.trait_id in (447,1) -- <-- HERE GOES TRAIT IDS 
    AND genomic_pos BETWEEN start AND end 
    AND domains.chr_id = snps.chr_id; 

が私のDBでありますSQLiteでenter image description here

+0

'SELECT DISTINCT'は、非常に多くの場合、あなたはuneccessarily以降のみ重複として多くの行を却下しなければならないためにテーブルを結合することにより、大規模な中間結果を構築不十分書かれたクエリのための指標です。私の答えを見てください。 –

答えて

2

私が正しく理解していれば、あなたはgroup byhavingで欲しい:

SELECT d.domain_id 
FROM snps s JOIN 
    traits_snps ts 
    ON s.snp_id = ts.snp_id JOIN 
    traits t 
    ON t.trait_id = ts.trait_id JOIN 
    chromosomes c 
    ON s.chr_id = c.chr_id JOIN 
    domains d 
    ON d.chr_id = c.chr_id AND 
     d.chr_id = s.chr_id -- JOIN conditions should be in ON clauses 
WHERE t.trait_id in (447, 1) AND -- <-- HERE GOES TRAIT IDS 
     genomic_pos BETWEEN start AND end 
GROUP BY d.domain_id 
HAVING COUNT(DISTINCT t.trait_id) = 2; 
1

WHERE EXISTSを使用し、一部のデータが他のテーブルに存在しているドメインを検索するに。

いかなる場合:

select domain_id 
from domains d 
where exists 
(
    select * 
    from snps 
    where snps.chr_id = d.chr_id 
    and snps.genomic_pos between d.start and d.end 
    and snps.snp_id in (select snp_id from traits_snps where trait_id in (447, 1)) 
); 

ALL場合:形質の少なくとも一つに関連して与えられた範囲内のSNPを持つドメインの検索に関連して、与えられた範囲内のSNPを持つドメインを探します形質のすべて:

select domain_id 
from domains d 
where exists 
(
    select * 
    from snps 
    where snps.chr_id = d.chr_id 
    and snps.genomic_pos between d.start and d.end 
    and snps.snp_id in 
    (
    select snp_id 
    from traits_snps 
    where trait_id in (447, 1) 
    group by snp_id 
    having count(distinct trait_id) = 2 
) 
); 
+0

私はあなたがそのsnpと特性が多対多の関係にあることを忘れていると思います。 '(447、1);のtrait_idが失敗する形質からsnp_idを選択してください。しかし、私はほとんど家にいる。ありがとうございました。 – user31027

+0

@ user31027:私はそれを認識していましたが、あなたの要求を誤解している可能性があります。私は少なくとも1つのsnpを持つドメインを探していますが、与えられた特質のうちの少なくとも1つ(すべてでresp。)を持っています。たぶん、すべてのドメインのsnpsがリクエストを処理したり、クエリに含まれていないものが必要になることがあります。 –

+0

しかし、サブサブセレクトが実行できない場合はどうすれば動作できますか? 'traitt'テーブルには' snp_id'カラムがありません。 – user31027

関連する問題