2012-06-15 39 views
0

我正在编写SQL Server 2008报告来比较动物的基因测试结果。基因检测由动物Id,基因和结果组成。并非所有的动物都具有相同的测试基因,但我需要能够针对给定的一组动物并排显示结果,并且仅包括存在于至少一种选定动物中的基因。SQL Server 2008:比较相似的记录 - 当JOIN没有匹配时,仍然需要显示记录的ID

我的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未显示(用户不希望看到它的结果)既不是结果基因“E”,因为既不是动物1,也不动物2有该基因的结果:

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 

如何获得SireIDs和CalfIDs时,他们没有与特定基因相关的记录,以显示他们的价值观?我正在考虑使用COALESCE,但我无法弄清楚如何指定正确的animalId传入。任何帮助,将不胜感激。

回答

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 
+0

嗯,这并给出正确的输出,但我不知道这是不够的动态。在构建查询时,我不会知道哪些基因没有给定动物的结果,因此查询需要能够确定。 – aleppke

+0

基本上,我不能将AnimalIDs硬编码到SELECT中,因为我将传入多个ID作为列表。其他一切都很好,因为我可以将“=”替换为“IN()”,但它只是将这些ID放入SELECT中,而不用对它们进行硬编码,这就困扰着我。 – aleppke

相关问题