Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL Server-任何表的条件联接都不为null_Sql_Sql Server 2005_Tsql_Join - Fatal编程技术网

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