在数据集的tsql联合中仅按联合的一个数据集排序

时间:2013-11-19 12:33:09

标签: sql tsql sql-order-by union

我有以下问题。

让TableA(Id int,Name nvarchar(200))和TableB(Id int,Name nvarchar(200))。

如果我们运行以下查询:

SELECT *
FROM
(SELECT *
 FROM TableA) 
UNION
(SELECT *
 FROM TableB)

我们得到两个数据集的并集。

我的问题是我希望第二个数据集的结果按名称列排序。

我之所以需要这个,是因为TableA是我查询中的临时表,总是会保存一条记录,而这条记录我希望成为两个数据集联合的结果数据集中的第一个。另外,我希望NameB的多个记录按名称列排序。

不幸的是,当我尝试执行以下查询时

SELECT *
FROM
(SELECT *
 FROM TableA) 
UNION
(SELECT *
 FROM TableB
 ORDER BY Name)

我收到一条含糊不清的错误消息,告知我关键字顺序附近的语法不正确。

提前感谢您的帮助。

1 个答案:

答案 0 :(得分:5)

试试这个:

select id 
     , name
  from
(select 1 as ordercol
      , a.id
      , a.name
   from tableA 
union
 select 2 as ordercol
      , b.id
      , b.name
   from tableB) i
order by ordercol, name

错误消息导致您尝试合并两个子选择。你可以在两个选择之间放置联合,然后将其放入子选择中。在union(或union all)之后总是有一个select。我还建议您使用union all,这样可以节省时间,因为sql-server会尝试删除两个选择中的记录(在这种情况下由于ordercol-column而不可能)

我已经包含了第二个order-by列,它将在第二个之前对第一个选择进行排序。如果您先按名称排序,然后按名称排序,则应获得所需的结果。