【问题标题】:order by only one dataset of a union in a tsql union of datasets在数据集的 tsql 联合中仅按联合的一个数据集排序
【发布时间】:2013-11-19 12:33:08
【问题描述】:

我有以下问题。

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

如果我们运行以下查询:

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

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

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

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

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

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

我收到一条模棱两可的错误消息,通知我关键字顺序附近的语法不正确。

提前感谢您的帮助。

【问题讨论】:

  • “这条记录我想成为结果数据集中的第一个” - 那么你最好在你的 ORDER BY 子句中包含一些导致这种情况发生的东西。 保证当使用UNION(或@ 987654327@) 运算符。
  • 当你在我的 ORDER BY 子句中说什么时,你是什么意思?
  • 您需要一个适用于整个结果集的ORDER BY子句,并考虑SELECT语句中所有的结果在 union 中,并指定 所有您的订购要求。
  • 好的,达米安。非常感谢。

标签: sql tsql sql-order-by union


【解决方案1】:

试试这个:

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 all,这样可以节省时间,因为 sql-server 否则会尝试删除两个选择中的记录(在这种情况下,由于 ordercol-column 是不可能的)

我已经包含了第二个排序列,它将在第二个之前对第一个选择进行排序。如果您先按那个顺序然后按名称订购,您应该会得到想要的结果。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-21
    • 1970-01-01
    • 2021-08-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多