按优先级加入和分组查询

时间:2017-02-06 11:25:39

标签: sql sql-server tsql

我有2个查询以相同的格式返回数据(年 - 数据 - 来源) 我需要加入他们从q1获取数据,如果q1中没有年份则从q2获取。

示例:

Q1结果集:

    Year - Data - Source
    2014 - 325 - DS1
    2015 - 500 - DS1
    2016 - 450 - DS2

Q2结果集:

    Year - Data - Source
    2016 - 375 - DS4
    2017 - 475 - DS4

预期结果集:

    Year - Data - Source
    2014 - 325 - DS1 --from q1
    2015 - 500 - DS1 --from q1
    2016 - 450 - DS2 --from q1
    2017 - 475 - DS4 --from q2

2 个答案:

答案 0 :(得分:1)

一种简单的方法是使用union all和一些逻辑:

select q1.year, q1.data, q1.source
from q1
union all
select q2.year, q2.data, q2.source
from q2
where not exists (select 1 from q1 where q1.year = q2.year);

如果子查询很昂贵,您可能不想两次引用q1。一种方法使用full join

select coalesce(q1.year, q2.year) as year,
       coalesce(q1.data, q2,data) as data,
       coalesce(q1.source, q2.source) as source
from q1 full outer join
     q2
     on q1.year = q2.year;

答案 1 :(得分:0)

这对你也有用,

Select * from Q1
Union (Select * from Q2 Where Year Not In (Select Year from Q1));