我需要按一个属性对结果进行排序:系列(对于每个表)。查询中还有一个视图... 原始查询是:
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
答案 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列,则可以进行安排。