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传入。任何帮助,将不胜感激。
嗯,这并给出正确的输出,但我不知道这是不够的动态。在构建查询时,我不会知道哪些基因没有给定动物的结果,因此查询需要能够确定。 – aleppke
基本上,我不能将AnimalIDs硬编码到SELECT中,因为我将传入多个ID作为列表。其他一切都很好,因为我可以将“=”替换为“IN()”,但它只是将这些ID放入SELECT中,而不用对它们进行硬编码,这就困扰着我。 – aleppke