Sql server 2008 SQL Server 2008:比较类似记录-当联接没有匹配项时,仍需要显示记录的ID
我正在写一份SQLServer2008报告,比较动物的基因测试结果。基因测试包括动物、基因和结果。并不是所有的动物都会有相同的基因测试,但我需要能够并排显示一组给定动物的结果,并且只包括至少一个选定动物的基因 我的TestResult表中包含以下数据: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
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,而不必硬编码它们。