Sql server 多表不工作的T-SQL外部联接

Sql server 多表不工作的T-SQL外部联接,sql-server,tsql,Sql Server,Tsql,我正在尝试使用MS SQL Server工具编写查询,不过我更习惯于使用Oracle SQL Developer。下面的查询将运行,但它只返回第一个表的结果。我也尝试过使用左连接而不是完全的外部连接,但得到了相同的结果。我做错了什么 SELECT c_s.FiscalYear, c_s.LeadMinistry, c_s.LogNo, c_s.MinRef, c_s.nl_Form FROM [cds].[dbo].[c_Submission] c_s FULL OUTER JOIN [cd

我正在尝试使用MS SQL Server工具编写查询,不过我更习惯于使用Oracle SQL Developer。下面的查询将运行,但它只返回第一个表的结果。我也尝试过使用左连接而不是完全的外部连接,但得到了相同的结果。我做错了什么

SELECT c_s.FiscalYear, c_s.LeadMinistry, c_s.LogNo, c_s.MinRef, c_s.nl_Form
  FROM [cds].[dbo].[c_Submission] c_s
FULL OUTER JOIN [cds].[dbo].[c_AdminData] c_ad
ON c_s.LogNo = c_ad.LogNo
FULL OUTER JOIN [cds].[dbo].[c_Edited Key Comments] c_kc
ON c_s.LogNo = c_kc.LogNo
FULL OUTER JOIN [cds].[dbo].[c_Edited Minutes] c_min
ON c_s.LogNo = c_min.LogNo
FULL OUTER JOIN [cds].[dbo].[c_MB20BA] c_bn
ON c_s.LogNo = c_bn.LogNo
WHERE (c_s.LogNo IS NOT NULL)
ORDER BY c_s.LogNo;

中的条件,其中
应在上的
子句中,否则完全连接将变为单侧连接:

select c_s.FiscalYear,
    c_s.LeadMinistry,
    c_s.LogNo,      -- Use coalesce to get non null LogNo from the join
    c_s.MinRef,
    c_s.nl_Form
from [cds].[dbo].[c_Submission] c_s
full outer join [cds].[dbo].[c_AdminData] c_ad
    on c_s.LogNo = c_ad.LogNo
full outer join [cds].[dbo].[c_Edited Key Comments] c_kc
    on c_s.LogNo = c_kc.LogNo
full outer join [cds].[dbo].[c_Edited Minutes] c_min
    on c_s.LogNo = c_min.LogNo
full outer join [cds].[dbo].[c_MB20BA] c_bn
    on c_s.LogNo = c_bn.LogNo
        and c_s.LogNo is not null
order by c_s.LogNo
您可以使用coalesce获取非空LogNo:

COALESCE(c_s.LogNo, c_ad.LogNo, c_kc.LogNo, c_min.LogNo)

中的条件,其中
应在
上的
子句中,否则完全连接将变为单侧连接:

select c_s.FiscalYear,
    c_s.LeadMinistry,
    c_s.LogNo,      -- Use coalesce to get non null LogNo from the join
    c_s.MinRef,
    c_s.nl_Form
from [cds].[dbo].[c_Submission] c_s
full outer join [cds].[dbo].[c_AdminData] c_ad
    on c_s.LogNo = c_ad.LogNo
full outer join [cds].[dbo].[c_Edited Key Comments] c_kc
    on c_s.LogNo = c_kc.LogNo
full outer join [cds].[dbo].[c_Edited Minutes] c_min
    on c_s.LogNo = c_min.LogNo
full outer join [cds].[dbo].[c_MB20BA] c_bn
    on c_s.LogNo = c_bn.LogNo
        and c_s.LogNo is not null
order by c_s.LogNo
您可以使用coalesce获取非空LogNo:

COALESCE(c_s.LogNo, c_ad.LogNo, c_kc.LogNo, c_min.LogNo)

如果要预筛选第一个表,最好在子查询或CTE中进行预筛选。如果希望所有表都实现真正的完全联接,则需要在键上使用COALESCE。否则它将成为左连接

;WITH _Submission AS 
(
    SELECT * FROM  [cds].[dbo].[c_Submission] c_s
    WHERE (c_s.LogNo IS NOT NULL)
)

SELECT c_s.FiscalYear, c_s.LeadMinistry,  COALESCE(c_s.LogNo, c_ad.LogNo, c_kc.LogNo, c_min.LogNo) AS LogNo, c_s.MinRef, c_s.nl_Form
FROM _Submission c_s
    FULL OUTER JOIN [cds].[dbo].[c_AdminData] c_ad
        ON c_s.LogNo = c_ad.LogNo
    FULL OUTER JOIN [cds].[dbo].[c_Edited Key Comments] c_kc
        ON COALESCE(c_s.LogNo, c_ad.LogNo)  = c_kc.LogNo
    FULL OUTER JOIN [cds].[dbo].[c_Edited Minutes] c_min
        ON COALESCE(c_s.LogNo, c_ad.LogNo, c_kc.LogNo) = c_min.LogNo
    FULL OUTER JOIN [cds].[dbo].[c_MB20BA] c_bn
        ON  COALESCE(c_s.LogNo, c_ad.LogNo, c_kc.LogNo, c_min.LogNo)  = c_bn.LogNo
ORDER BY LogNo;

如果要预筛选第一个表,最好在子查询或CTE中进行预筛选。如果希望所有表都实现真正的完全联接,则需要在键上使用COALESCE。否则它将成为左连接

;WITH _Submission AS 
(
    SELECT * FROM  [cds].[dbo].[c_Submission] c_s
    WHERE (c_s.LogNo IS NOT NULL)
)

SELECT c_s.FiscalYear, c_s.LeadMinistry,  COALESCE(c_s.LogNo, c_ad.LogNo, c_kc.LogNo, c_min.LogNo) AS LogNo, c_s.MinRef, c_s.nl_Form
FROM _Submission c_s
    FULL OUTER JOIN [cds].[dbo].[c_AdminData] c_ad
        ON c_s.LogNo = c_ad.LogNo
    FULL OUTER JOIN [cds].[dbo].[c_Edited Key Comments] c_kc
        ON COALESCE(c_s.LogNo, c_ad.LogNo)  = c_kc.LogNo
    FULL OUTER JOIN [cds].[dbo].[c_Edited Minutes] c_min
        ON COALESCE(c_s.LogNo, c_ad.LogNo, c_kc.LogNo) = c_min.LogNo
    FULL OUTER JOIN [cds].[dbo].[c_MB20BA] c_bn
        ON  COALESCE(c_s.LogNo, c_ad.LogNo, c_kc.LogNo, c_min.LogNo)  = c_bn.LogNo
ORDER BY LogNo;


当我尝试这样做时,它仍然是一个片面的查询,但我也得到了c_.LogNo所在的结果null@b00kgrrl-如果您想要完全联接,则可能有一行c_Submission没有与联接其余部分匹配的行。
ON
子句中的NULL检查将从c_提交表中排除LogNo为NULL的任何行。因此,NULL check-in
ON
子句只过滤表中的NULL,但在
中相同,其中
子句过滤表中的NULL以及join。c_提交表有元数据,因此如果其他四个表中存在LogNo,那么它也将存在于c_提交中。所以一个左连接实际上应该是可以的,空检查应该不是问题。当我尝试这样做时,它仍然是一个单边查询,但我也得到了c_.LogNo所在的结果null@b00kgrrl-如果您想要完全联接,则可能有一行c_Submission没有与联接其余部分匹配的行。
ON
子句中的NULL检查将从c_提交表中排除LogNo为NULL的任何行。因此,NULL check-in
ON
子句只过滤表中的NULL,但在
中相同,其中
子句过滤表中的NULL以及join。c_提交表有元数据,因此如果其他四个表中存在LogNo,那么它也将存在于c_提交中。所以一个左连接应该是可以的,空检查应该不是问题。。。当我尝试这样做时,它仍然是一个单边查询,但我也会得到c_.s.LogNo为空的结果。在我看来,您需要使用左连接而不是完全连接。您能详细说明一下“单边”查询吗?你想实现什么?这是片面的,因为我只返回第一个表中的记录。我希望最后一列nl_Form显示多种类型的表单,但我只看到一种类型的表单(Submission),它告诉我所有记录都来自Submission表。我同意左连接也应该有效,但它给了我同样的结果。我能够在Oracle中进行外部联接和左联接。语法上有区别吗?没有。语法应该是相同的。LogNo它是什么数据类型?你介意发布一些样本数据吗?同上。。。当我尝试这样做时,它仍然是一个单边查询,但我也会得到c_.s.LogNo为空的结果。在我看来,您需要使用左连接而不是完全连接。您能详细说明一下“单边”查询吗?你想实现什么?这是片面的,因为我只返回第一个表中的记录。我希望最后一列nl_Form显示多种类型的表单,但我只看到一种类型的表单(Submission),它告诉我所有记录都来自Submission表。我同意左连接也应该有效,但它给了我同样的结果。我能够在Oracle中进行外部联接和左联接。语法上有区别吗?没有。语法应该是相同的。LogNo它是什么数据类型?您介意发布一些示例数据吗?因为您只从
c\u
中选择列。。。你想从什么中得到什么?请提供样本数据和输出。thanksHi@SqlZim每个表中都应该有两列(LogNo和nl_Form),但我只能从c_提交表中获得结果hi@rh ian我将尝试创建一些虚拟数据LogNo是什么数据类型?因为您只从
c_s
中选择列。。。你想从什么中得到什么?请提供样本数据和输出。thanksHi@SqlZim每个表中都应该有两列(LogNo和nl_Form),但我只能从c_提交表中获得结果hi@rh-ian我将尝试创建一些虚拟数据LogNo是什么数据类型?