加入两个表并根据数据从一个或另一个返回数据

时间:2013-12-14 04:16:22

标签: sql sql-server

  1. SQL 2012
  2. 无法更改表格
  3. 有两个表有问题,两个表都相同
  4. (我没有设计这个)
  5. 表A包含应用程序数据。我们接受申请,在申请时我们需要最少的信息 - 这里的许多值可以为空(或者像NA等一些占位符)。它被分配了一个应用程序编号(应用程序ID)。如果申请被接受,我们需要更多信息 - 我们会对其进行验证。

    将我们引导至表B - A的副本,但它仅填充了已接受的应用程序 - 以及经过验证的数据。因此,如果经理接受,应用程序ID将仅存在于表B中。有时,在应用程序进程中,数据是正确的,并且没有进行任何更改 - 导致应用程序ID在两个表中都具有确切的值。有时,数据会发生变化或被添加(我们在接受时需要所有字段)。

    我想以一种简单的方式捕获所有应用程序和最新/验证的数据。

    例如:

    Table A (Active Applications)
    ApplicationID    Phone          State    
    1234             123-456-7890    AK        
    5678             246-802-4680    NULL      
    
    Table B (Approved/Accepted Applications)
    ApplicationID    Phone           State    
    5678             246-802-4680     NY        
    

    申请5678获得批准,仅供示范,该州被证实为纽约州。 申请1234迄今未获批准(但可能在将来)。

    我想写一个查询,它给出了以下结果:

    ApplicationID    Phone           State
    1234             123-456-7890     AK
    5678             246-802-4680     NY
    

    期望的行为本质上是......返回表A,除非表中存在ApplicationID,然后给我表B.

    表A确实包含所有已过期的应用程序,但是有一个到期日期(应用程序有效期为10天),并且很容易根据该日期剔除这些应用程序。 只需要通过批准和有效的应用程序就可以解决问题。

    非常感谢任何帮助。

    - EDIT-- 谢谢...但是如何处理占位符(如NA或XX)或验证数据与应用程序数据不同?假设第三个活动应用程序如此:

        Table A (Active Applications)
        ApplicationID    Phone           State
        9876             234-432-1234     NY
    
        Table B (Approved Applications)
        ApplicationID    Phone           State
        9876             234-432-1234     TX
    

    该申请因其在表B中的存在而被接受,但该州被证实为TX而非NY。

    我希望看到一个输出...表A如果不在表B中的数据.IF在表B中然后是表B数据。

    ApplicationID     Phone          State
    1234             123-456-7890     AK
    5678             246-802-4680     NY
    9876             234-432-1234     TX
    

2 个答案:

答案 0 :(得分:0)

Select a.applicationid, case when b.phone is null then a.phone else b.phone end as phone, case when b.state is null then a.state else b.state end as state
From a
Left outer join b on a.applicationid = b.applicationid

答案 1 :(得分:0)

select 
a.applicationid as a1, a.phone as a2, a.state as a3,
b.applicationid as b1, b.phone as b2, b.state as b3,
isnull(b.applicationid, a.applicationid) as applicationid,
isnull(b.phone, a.phone) as phone,
isnull(b.state, a.state) as state
from a
left outer join b on a.applicationid=b.applicationid

(省略第2行和第3行,这些只是为了显示isnull()之前列条目的内容)