0

動物の遺伝子検査結果を比較する SQL Server 2008 レポートを書いています。遺伝子検査は、animalId、遺伝子、および結果で構成されます。すべての動物で同じ遺伝子がテストされるわけではありませんが、特定の動物セットの結果を並べて表示し、選択した動物の少なくとも 1 匹に存在する遺伝子のみを含める必要があります。

私の TestResult テーブルには、次のデータが含まれています。

animalId    gene    result
1           a       CC
1           b       CT
1           d       TT
2           a       CT
2           b       CT
2           c       TT
3           a       CT
3           b       TT
3           c       CC
3           d       CC
3           e       TT

次のような結果セットを生成する必要があります。動物 3 が表示されていないことに注意してください (ユーザーはその結果を見たくありません)。また、動物 1 も動物 2 もその遺伝子の結果を持っていないため、遺伝子「e」の結果も表示されていません。

SireID  SireResult  CalfID  CalfResult Gene
1       CC          2       CT          a
1       CT          2       CT          b
1       NULL        2       TT          c
1       TT          2       NULL        d

しかし、私はこれを取得することしかできません:

SireID  SireResult  CalfID  CalfResult Gene
1       CC          2       CT          a
1       CT          2       CT          b
NULL    NULL        2       TT          c
1       TT          NULL    NULL        d

これは私が使用しているクエリです。

SELECT
    sire.animalId AS 'SireID'
    ,sire.result AS 'SireResult'
    ,calf.animalId AS 'CalfID'
    ,calf.result AS 'CalfResult'
    ,sire.gene AS 'Gene'
FROM
    (SELECT 
        s.animalId 
        ,s.result 
        ,m1.gene 
    FROM
        (SELECT [animalId ]
            ,result 
            ,gene 
        FROM TestResult
        WHERE animalId IN (1)) s
    FULL JOIN
        (SELECT DISTINCT 
            gene 
        FROM TestResult
        WHERE animalId IN (1, 2)) m1
    ON s.marker = m1.marker) sire
FULL JOIN
    (SELECT 
        c.animalId 
        ,c.result 
        ,m2.gene 
    FROM
        (SELECT animalId 
            ,result 
            ,gene 
        FROM TestResult
        WHERE animalId IN (2)) c
    FULL JOIN
        (SELECT DISTINCT 
            gene 
        FROM TestResult
        WHERE animalId IN (1, 2)) m2
    ON c.gene = m2.gene) calf
ON 
    sire.gene = calf.gene

特定の遺伝子に関連付けられたレコードがない場合、SireID と CalfID の値を表示するにはどうすればよいですか? COALESCE を使用することを考えていましたが、渡す正しい animalId を指定する方法がわかりません。

4

1 に答える 1

0

私はこれに来ました:

SELECT A.animalId  AS SireID, A.result AS SireResult, B.animalid  AS CalfID, B.Result AS CalfResult, A.gene
  FROM TestResult A  INNER JOIN  TestResult B
ON A.gene = B.gene 
 WHERE A.animalId = 1 AND B.animalId = 2
 UNION 
SELECT 1 AS SireID, NULL AS SireResult, animalid  AS CalfID, Result AS CalfResult, gene
  FROM TestResult 
 WHERE animalId = 2 and gene not in (select distinct gene from TestResult where animalId = 1)
 UNION 
SELECT animalid AS SireID, Result AS SireResult, 2 AS CalfID, NULL AS CalfResult, gene
  FROM TestResult 
 WHERE animalId = 1 and gene not in (select distinct gene from TestResult where animalId = 2)  
ORDER BY SireID, A.gene, SireResult
于 2012-06-16T03:11:07.637 に答える