SQL Server-任何表的条件联接都不为null
措辞不当的标题我道歉 我正在尝试将一个表连接到另外两个表中的一个 主表 微妙的 子表存档SQL Server-任何表的条件联接都不为null,sql,sql-server-2005,tsql,join,Sql,Sql Server 2005,Tsql,Join,措辞不当的标题我道歉 我正在尝试将一个表连接到另外两个表中的一个 主表 微妙的 子表存档 因此,MasterTable包含一个ID字段。 SubTable和SubTableArchive包含联接的MasterTableId字段 但是,数据将永远只存在于其中一个子表中。所以我只想连接到任何一个有数据的表 但我所知道的唯一方法是加入这两者,并在我选择的所有字段上使用isnull,读(写)起来很快变得复杂。 特别是因为一些字段已经用ISNULL包装了 SELECT M.Id, ISNULL(S.Fi
因此,MasterTable包含一个ID字段。 SubTable和SubTableArchive包含联接的MasterTableId字段 但是,数据将永远只存在于其中一个子表中。所以我只想连接到任何一个有数据的表 但我所知道的唯一方法是加入这两者,并在我选择的所有字段上使用isnull,读(写)起来很快变得复杂。 特别是因为一些字段已经用ISNULL包装了
SELECT M.Id, ISNULL(S.Field1, SA.field1), ISNULL(S.field2, SA.Field2),
SUM(CASE WHEN (ISNULL(S.Finished,SA.Finished)=1 AND ISNULL( ISNULL(S.ItemCode,SA.ItemCode),'')='') THEN 1 WHEN (ISNULL(S.Finished,SA.Finished)=0 AND ISNULL( ISNULL(S.AltItemCode,SA.AltItemCode),'')='') THEN 1 ELSE 0 END) AS SummaryField
FROM MAsterTable M
LEFT OUTER JOIN SubTable S ON S.MasterTableId = M.Id
LEFT OUTER JOIN SubTableArchive SA ON S.MasterTableId = M.Id
GROUP BY M.Id, ISNULL(S.Field1, SA.field1), ISNULL(S.field2, SA.Field2)
所以这是可行的,但并不漂亮。
这是一个示例,但真正的查询更长、更复杂
我希望SQL可能内置了某种条件连接功能。
做一些我想做的事情,让查询更友好一些。不,不幸的是,没有。另一种选择是使用并集,然后使用内部联接
SELECT M.x, S.x
FROM MAsterTable M INNER JOIN SubTable S ON S.MasterTableId = M.Id
UNION
SELECT M.x, STA.x
FROM MAsterTable M INNER JOIN SubTableArchive STA ON STA.MasterTableId = M.Id
从维护的角度来看,如果您将上述联合作为一个视图,那么您可以对该视图应用where过滤器和排序,这将简化问题。试试这个
SELECT M.Id, S.Field1,S.field2,
SUM(CASE WHEN S.Finished=1 AND ISNULL( S.ItemCode,'')='')
THEN 1
WHEN S.Finished=0 AND ISNULL( S.AltItemCode,'')='')
THEN 1 ELSE 0 END) AS SummaryField
FROM MAsterTable M
JOIN (
SELECT id,field1,field2,ItemCode,AltItemCode,finished
FROM subTable
UNION
SELECT id,field1,field2,ItemCode,AltItemCode,finished
FROM subTableArchive
) S ON S.id = M.Id
GROUP BY M.Id, S.Field1,S.field2
使用sub-select或更好的语句(未测试代码):
由于主表中的
ID
值将只存在于一个表(子表
或子表存档
)中,因此可以使用此查询:
SELECT MasterTableId Id, Field1, Field2,
SUM(CASE
WHEN Finished=1 AND ItemCode IS NULL THEN 1 --OR ISNULL(ItemCode,'') = ''
WHEN Finished=0 AND AltItemCode IS NULL THEN 1 --OR ISNULL(AltItemCode,'') = ''
ELSE 0
END) AS SummaryField
FROM SubTable
GROUP BY 1, 2, 3
UNION ALL
SELECT MasterTableId Id, Field1, Field2,
SUM(CASE
WHEN Finished=1 AND ItemCode IS NULL THEN 1 --OR ISNULL(ItemCode,'') = ''
WHEN Finished=0 AND AltItemCode IS NULL THEN 1 --OR ISNULL(AltItemCode,'') = ''
ELSE 0
END) AS SummaryField
FROM SubTableArchive
GROUP BY 1, 2, 3
SELECT MasterTableId Id, Field1, Field2,
SUM(CASE
WHEN Finished=1 AND ItemCode IS NULL THEN 1 --OR ISNULL(ItemCode,'') = ''
WHEN Finished=0 AND AltItemCode IS NULL THEN 1 --OR ISNULL(AltItemCode,'') = ''
ELSE 0
END) AS SummaryField
FROM SubTable
GROUP BY 1, 2, 3
UNION ALL
SELECT MasterTableId Id, Field1, Field2,
SUM(CASE
WHEN Finished=1 AND ItemCode IS NULL THEN 1 --OR ISNULL(ItemCode,'') = ''
WHEN Finished=0 AND AltItemCode IS NULL THEN 1 --OR ISNULL(AltItemCode,'') = ''
ELSE 0
END) AS SummaryField
FROM SubTableArchive
GROUP BY 1, 2, 3