2017-09-25 34 views
1

当我使用以下代码加入最近更新的地址时,它导致ZIP中的所有相关字段返回为NULL。我已经尝试了一个外部应用程序,它做得更好,但它不会从右侧的两个表中检索到每一个zip,即使它们存在。左外部加入选择前1个结果为空

SELECT 
    i.ion_ID as [ION], 
    zip.City as [City], 
    zip.StateCode as [State], 
    zip.ZipCode as [Zip Code], 
    zip.County as [County] 
FROM  
    HWSP_t_ION i 
     LEFT OUTER JOIN (SELECT TOP 1 ad.AssociatedIDValue, z.Zipcode, z.City, z.StateCode, z.County 
            FROM CADD_t_Address ad 
             LEFT OUTER JOIN CADD_lt_ZipCode z 
              ON ad.zip = z.ZipCode 
            ORDER BY ad.ChangedOn desc 
             ) AS ZIP 
     ON zip.AssociatedIDValue = i.ION_ID 

编辑: 这是外应用看起来像:

SELECT 
    i.ion_ID as [ION], 
    zip.City as [City], 
    zip.StateCode as [State], 
    zip.ZipCode as [Zip Code], 
    zip.County as [County] 
OUTER APPLY       (SELECT TOP 1 ad.zip 
            FROM CADD_t_Address ad 
            WHERE ad.AssociatedIDValue = ci.ION_ID 
            and [ad].[Status] = 'ACTIVE' 
            ORDER BY ad.ChangedOn desc 
             ) ad 


OUTER APPLY       (SELECT TOP 1 zip.Zipcode, zip.City, zip.StateCode, zip.County as [County] 
            FROM CADD_lt_ZipCode zip 
            WHERE ad.zip = zip.ZipCode 
            ) zip 
+1

如果您想提供样本数据和期望的结果 – Veljko89

+0

我希望我可以,但这是使用PII的敏感数据。 ION是案例编号,它拉动所有300k +行。其余的字段(zip.xxx)全部返回为空。所以有些东西不能正确连接。 –

+0

尝试将其分解并将其解密。如果你可以用简单的话来说,它可以帮助你找出你需要的地方。您使用的是哪个版本的SQL。尝试类似sqlfiddle的东西,看看你是否可以设置一个你想要做的事情的基本例子。 – Shawn

回答

1

当使用SQL工作,内置认为你的数据。想想你想如何组合。在这种情况下,你只需要一行内部集合来获取外部集合的数据。窗口函数对于内部集合非常适用。您正在生成一个行号(rn)来指定排序中的第一行,然后排除任何不是rn = 1的行。一旦你有这个单一的最新记录,然后只是链接两套。

试着这么做:

SELECT 
    t1.ID 
    , s2.blah 
    , s2.moreBlah 
FROM t1 
LEFT OUTER JOIN (
    SELECT * 
    FROM (
     SELECT t2.id, t2.blah, t3.moreBlah 
      , ROW_NUMBER() OVER (PARTITION BY <columnToBaseOrderFrom> ORDER BY changeDate DESC) AS rn 
     FROM t2 
     LEFT OUTER JOIN t3 ON t2.refID = t3.id 
    ) s1 
    WHERE rn = 1 
) s2 ON t1.id2 = s2.id 

如果你需要消除NULL的记录,你必须确定,如果你想从T1到被淘汰的行,如果他们没有从比赛s2子查询。如果是这样的话,你需要INNER JOIN而不是LEFT OUTER JOIN。

+0

这工作!但是,我仍然看到了在外部应用中看到的相同空值,因此必须存在一些根本性的不相关问题。我会继续努力的。谢谢你的帮助! –

+0

然后,您的'ZIP'子查询中的行不匹配到您的'HWSP_t_ION'表。再次检查他们应该加入'zip.AssociatedIDValue = i.ION_ID'。您也可以独立运行每个查询以查看返回的内容。最后说明:你需要一个'INNER JOIN'还是一个'LEFT OUTER JOIN'? – Shawn

+0

肯定是左外连接,并回答你先前的问题,我使用的是SQL Server 2016. –