jb.*_*jb. 2 sql t-sql join sql-server-2005
标题措辞不当,我深表歉意。
我正在尝试将一个表连接到另外两个表之一
主表 子表 子表存档
因此,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 可能内置了某种条件连接功能。可以做我想做的事情,并使查询本身更友好一些。
另一种选择是使用 UNION,然后使用 INNER JOIN
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 过滤器和排序应用于视图,这应该会简化问题。