合并具有相同列但具有不同选择值的2个表

时间:2017-02-27 23:50:08

标签: sql-server join

有人可以建议如何合并下面的这两个结果集/表,以便实现预期的输出。

  • currentPrice值将优先于PriceChangedTable,如果StatusChangedTable不可用。 Null是有效值。

  • status值将优先于StatusChangedTable,如果PriceChangedTable不可用

PriceChangedTable:

    Id  vehicle     currentPrice    status
    ---------------------------------------------
    1   toyota      50000           Available
    2   nisaan      null            Available
    3   bmw         30000           Pending

StatusChangedTable:

    Id  vehicle     currentPrice    status
    ---------------------------------------------
    1   toyota      null            NotAvailable
    3   bmw         40000           NotAvailable
    4   dodge       50000           Pending

合并上述2个表的输出:

    Id  vehicle     currentPrice    status
    ---------------------------------------------
    1   toyota      50000           NotAvailable
    2   nisaan      null            Available
    3   bmw         30000           NotAvailable
    4   dodge       50000           Pending

请不要判断桌上的设计技巧。

2 个答案:

答案 0 :(得分:0)

此查询将返回预期输出:

select
    p.Id
    ,p.vehicle
    ,p.currentPrice
    -- status value priority 1) StatusChangedTable, 2) PriceChangedTable
    ,case when s.Id is not null then s.status else p.status end as status
from PriceChangedTable p
left join StatusChangedTable s on p.Id = s.Id
union
select
    s.Id
    ,s.vehicle
    -- currentPrice value priority 1) PriceChangedTable, 2) StatusChangedTable
    ,case when p.Id is not null then p.currentPrice else s.currentPrice end as currentPrice
    ,s.status
from StatusChangedTable s
left join PriceChangedTable p on p.Id = s.Id

答案 1 :(得分:0)

尝试使用其他样本数据,

SELECT isnull(pc.Id, sc.id) id
    ,isnull(pc.vehicle, sc.vehicle) vehicle
    ,isnull(pc.currentPrice, sc.currentPrice) currentPrice
    ,isnull(sc.[status], pc.[status]) [status]
FROM @PriceChnagedTable PC
FULL OUTER JOIN @StatusChangedTable SC ON pc.id = sc.Id