2013-04-23 95 views
0

我有一个表包含多个日期的多个记录。全外连接不返回所有行?

我想看看“日期1”和“日期2”之间的区别,我的完整外连接没有返回我期待的数据。

我知道在日期1和13282在日期2有13278行 - 因此,我期望看到至少13282行,但我回到13195 ...这是一个INNER JOIN(我测试了这个)。

我希望像结果:

001  00NULL 1000 
001  000124 009 1000 1000 
001  000125 009 1000 1000 
001  000126 009 1000 NULL 

但这不会从任何一方得到任何空行?

SELECT 
    COALESCE(c.AccountBranch, p.AccountBranch) 
    , COALESCE(c.AccountNumber, p.AccountNumber) 
    , COALESCE(c.AccountSuffix, p.AccountSuffix) 
    , c.PrincipleAmount 
    , p.PrincipleAmount 
    FROM ADStaging..cb_account_extension_principle_dpd c 
    FULL OUTER JOIN ADStaging..cb_account_extension_principle_dpd p 
     ON p.AccountBranch = c.AccountBranch 
     AND p.AccountNumber = c.AccountNumber 
     AND p.AccountSuffix = c.AccountSuffix 
WHERE 
    (c.BusinessDataDate IS NULL OR c.BusinessDataDate = @CurrentBusinessDataDate) 
    AND 
    (p.BusinessDataDate IS NULL OR p.BusinessDataDate = @PreviousBusinessDataDate) 

这工作 - 结合的 “钥匙” 在两个单独的SELECT语句中加入?

SELECT 
     COALESCE(C.Account, P.Account) AS Account 
    , COALESCE(C.AccountBranch, P.AccountBranch) as AccountBranch 
    , COALESCE(C.AccountNumber, P.AccountNumber) as AccountNumber 
    , COALESCE(C.AccountSuffix, P.AccountSuffix) as AccountSuffix 
    , P.PrincipleAmount AS PreviousAmount 
    , C.PrincipleAmount AS CurrentAmount 
    , ISNULL(C.PrincipleAmount, P.PrincipleAmount) - ISNULL(P.PrincipleAmount,0) 
FROM 
(SELECT 
    (pd.AccountBranch + pd.AccountNumber + pd.AccountSuffix) AS Account 
    , pd.AccountBranch 
    , pd.AccountNumber 
    , pd.AccountSuffix 
    , pd.PrincipleAmount 
FROM ADStaging..cb_account_extension_principle_dpd pd 
WHERE pd.BusinessDataDate = @CurrentBusinessDataDate) C 
FULL OUTER JOIN 
(SELECT 
    (pd.AccountBranch + pd.AccountNumber + pd.AccountSuffix) AS Account 
    , pd.AccountBranch 
    , pd.AccountNumber 
    , pd.AccountSuffix 
    , pd.PrincipleAmount 
FROM ADStaging..cb_account_extension_principle_dpd pd 
WHERE pd.BusinessDataDate = @PreviousBusinessDataDate) P 
    ON P.Account = C.Account 
WHERE 
    (P.PrincipleAmount IS NULL OR C.PrincipleAmount IS NULL) 
    OR 
    P.PrincipleAmount <> C.PrincipleAmount 

但这并不 - 加入对组合值 - 只有当他们单独的表?

SELECT 
    COALESCE(c.AccountBranch, p.AccountBranch) 
    , COALESCE(c.AccountNumber, p.AccountNumber) 
    , COALESCE(c.AccountSuffix, p.AccountSuffix) 
    , c.PrincipleAmount 
    , p.PrincipleAmount 
    FROM ADStaging..cb_account_extension_principle_dpd c 
    FULL OUTER JOIN ADStaging..cb_account_extension_principle_dpd p 
     ON (p.AccountBranch + p.AccountNumber + p.AccountSuffix) 
     = (c.AccountBranch + c.AccountNumber + c.AccountSuffix) 
WHERE 
    (c.BusinessDataDate = @CurrentBusinessDataDate) 
    AND 
    (p.BusinessDataDate = @PreviousBusinessDataDate) 
+0

执行计划显示这是运行INNER JOIN?现在很困惑! – BlueChippy 2013-04-23 11:29:13

+0

在哪里杀死一个外连接的条件。 – Paparazzi 2013-04-23 13:50:06

回答

0

我认为你的问题是在第一个查询中日期不是匹配的一部分。在你的第二个查询中,你加入的两个集合已经过滤,所以它模仿了如果你在日期匹配会发生什么。假设你有相同的账户分支,数字,后缀两次,但在不同的日期!这意味着完整的外连接会找到一个匹配,因为您在ON子句中没有日期。

尝试了这一点:

use ADStaging; 
--your dates go here: 
declare @CurrentBusinessDataDate date = '2013-04-21' 
, @PreviousBusinessDataDate date = '2013-04-23'; 
SELECT 
COALESCE(c.AccountBranch, p.AccountBranch) 
, COALESCE(c.AccountNumber, p.AccountNumber) 
, COALESCE(c.AccountSuffix, p.AccountSuffix) 
, c.PrincipleAmount 
, p.PrincipleAmount 

FROM cb_account_extension_principle_dpd AS c 
FULL OUTER JOIN cb_account_extension_principle_dpd AS p 
    ON p.AccountBranch = c.AccountBranch 
    AND p.AccountNumber = c.AccountNumber 
    AND p.AccountSuffix = c.AccountSuffix 
    AND p.BusinessDataDate = @PreviousBusinessDataDate 
    AND c.BusinessDataDate = @CurrentBusinessDataDate; 
+0

这正是我不想要的!大声笑我不希望日期相同...我想date1和date2之间的区别 - 他们永远不会是相同的,所以加入他们返回零行。 – BlueChippy 2013-04-23 12:18:41

+0

一些示例数据会很好,谢谢!最好在sqlfiddle.com上。 – 2013-04-23 12:21:39

+0

我在日期的代码中做了一点脑力激荡。我更新它以匹配我实际上认为你想要的(并且符合我在代码上面实际说明的内容!)现在就试试吧。 – 2013-04-23 12:24:50

8

的地方被杀害外连接。
列不能同时为null和=为一个值。
将条件放入连接中。

SELECT COALESCE(c.AccountBranch, p.AccountBranch) 
    , COALESCE(c.AccountNumber, p.AccountNumber) 
    , COALESCE(c.AccountSuffix, p.AccountSuffix) 
    , c.PrincipleAmount, p.PrincipleAmount 
FROM   cb_account_extension_principle_dpd c 
FULL OUTER JOIN cb_account_extension_principle_dpd p 
    ON p.AccountBranch = c.AccountBranch 
AND p.AccountNumber = c.AccountNumber 
AND p.AccountSuffix = c.AccountSuffix 
AND c.BusinessDataDate = @CurrentBusinessDataDate 
AND p.BusinessDataDate = @PreviousBusinessDataDate 
+0

为什么要p.AccountNumber = c.AccountSuffix和p.AccountSuffix = c.AccountNumber?这看起来倒退。 – 2013-04-25 14:07:49

+0

@DavidSöderlund修,谢谢 – Paparazzi 2013-04-25 17:51:38