Sql server 2008 SQL Server 2008:比较类似记录-当联接没有匹配项时,仍需要显示记录的ID

Sql server 2008 SQL Server 2008:比较类似记录-当联接没有匹配项时,仍需要显示记录的ID,sql-server-2008,join,null,default-value,Sql Server 2008,Join,Null,Default Value,我正在写一份SQLServer2008报告,比较动物的基因测试结果。基因测试包括动物、基因和结果。并不是所有的动物都会有相同的基因测试,但我需要能够并排显示一组给定动物的结果,并且只包括至少一个选定动物的基因 我的TestResult表中包含以下数据: animalId gene result 1 a CC 1 b CT 1 d TT 2 a CT 2

我正在写一份SQLServer2008报告,比较动物的基因测试结果。基因测试包括动物、基因和结果。并不是所有的动物都会有相同的基因测试,但我需要能够并排显示一组给定动物的结果,并且只包括至少一个选定动物的基因

我的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
当没有与特定基因相关联的记录时,如何让海妖和calfid显示它们的值?我正在考虑使用COALESCE,但我不知道如何指定要传入的正确animalId。任何帮助都将不胜感激。

我想到这一点:

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

这确实给出了正确的输出,但我不确定它是否足够动态。在构建查询时,我不知道对于给定的动物,哪些基因没有结果,因此查询需要能够确定这些结果。基本上,我不能将动物硬编码到SELECT中,因为我将以列表形式传递多个ID。其他一切都很好,因为我可以将“=”替换为“IN”,但让我感到困惑的是,只需将这些ID放入SELECT,而不必硬编码它们。