在UNION子句中按order by在左联接中存在一个视图

时间:2018-07-09 14:33:17

标签: sql sql-server

我需要按一个属性对结果进行排序:系列(对于每个表)。查询中还有一个视图... 原始查询是:

    select zz.Id
          ,t1.Series
          ,t1.SeriesType
    from table 1 t1 
    inner join another_table (...)
    left join view (...)

    UNION

    select zz.Id
          ,t2.Series
          ,t2.SeriesType
    from table 2 t2
    inner join another_table (...)
    left join view (...)

    UNION

    select zz.Id
          ,t3.Series
          ,t3.SeriesType
    from table 3 t3 
    inner join another_table (...)
    left join view (...) 

    order zz.Id

有效,但仅给出zz.Id的顺序。如何实现每个表的“系列”列的顺序?

我尝试过:

select *
from
    (
    SELECT TOP 100 PERCENT zz.Id
          ,t1.Series
          ,t1.SeriesType
    from table 1 t1 
    inner join another_table (...)
    left join view (...)
    order by t1.Series) as table1

    UNION
select *
from
    (    
    SELECT TOP 100 PERCENT zz.Id
          ,t2.Series
          ,t2.SeriesType
    from table 2 t2
    inner join another_table (...)
    left join view (...)
    order by t2.Series) as table2

    UNION

select *
from
    (
    SELECT TOP 100 PERCENT zz.Id
          ,t3.Series
          ,t3.SeriesType
    from table 3 t3 
    inner join another_table (...)
    left join view (...)
    order by t3.Series) as table3        

所有表都由一个表连接,而zz.id对于table1,table2,table3是唯一的。 (我看到不可能同时对ID和系列进行排序。因此,我只会按系列的每种类型对系列进行排序)。谢谢。

例如表1是:

zz.Id     t1.series      SERIES_Type
---------------------------------
1         4545              1
2         5655              1
3         2344              1

表2

zz.Id     t2.series   SERIES_Type
---------------------------------
4         4546            2

表3

zz.Id     t3.series    SERIES_Type
--------------------------------
5         545             3   
6         343             3
7         2344            3

最终结果应为:

zz.Id       series    SERIES_Type
--------------------------------
3             2344       1
1             4545       1
2             5655       1
4             4546       2     
6             343        3
5             545        3
7             2344       3

3 个答案:

答案 0 :(得分:1)

您是否尝试过order by中的两个键?

order Id, SeriestType

答案 1 :(得分:1)

根据您的“预期结果”,您需要做的是:

order by SeriesType, Series

我是正确的还是被误解了?

答案 2 :(得分:0)

只要您使用“前100%”,就停止编码。永远没有任何用处。结果集(这是查看行的唯一方法)没有可靠或已定义的顺序,除非生成该结果集的查询包含order by子句。如果要根据并集中的每个查询对行进行排序,则需要在每个查询中添加一列,然后将其包含在最终的sort by子句中。

作为示例,这将添加一个名为srt的列(因为“ sort”是保留字-选择一个对您有意义的名称)。联合中的每个参与查询都分配有一个值,该值可用于标识“组”。再次-使它对您有意义。该列作为第一列包含在最终的sort by子句中,并将对行进行“分组”。

use tempdb;
go

declare @tbl table (id int not null, series varchar(10) not null, seriestype varchar(10) not null); 
insert @tbl(id, series, seriestype) values (1, '4521', 1), (1, '3011', 1), (2, '9999', 2), (3, '0000', 1), (3, '1111', 1);

select id, series, seriestype, 1 as srt from @tbl where id = 1 
union all
select id, series, seriestype, 2 as srt from @tbl where id = 2
union all 
select id, series, seriestype, 3 as srt from @tbl where id = 3 
order by srt, id, series; 

现在您已经更新了帖子,看来您也许可以按序列类型进行排序。但是由于您的查询逻辑和表中存在的数据,这可能是偶然的。只有您知道那是否正确。 TBH,我发现使用联合(相对于您的样本输出)是可疑的。

最后一点。如果您不想在最终结果集中看到srt列,则可以进行安排。