通过联合使用不同的顺序

Bar*_*rny 9 sql t-sql sql-server

我想写一个像这样的查询

    select top 10 * from A
    order by price
    union
    select top 3 * from A 
    order by price
Run Code Online (Sandbox Code Playgroud)

或者......那样的

    select top 10 * from A
    where name like '%smt%'
    order by price
    union
    select top 3 * from A
    where name not like '%smt%'
    order by price 
Run Code Online (Sandbox Code Playgroud)

你能帮我么?

Tim*_*ter 15

这应该工作:

SELECT * 
FROM (SELECT TOP 10 A.*, 0 AS Ordinal
      FROM A
      ORDER BY [Price]) AS A1

UNION ALL

SELECT * 
FROM (SELECT TOP 3 A.*, 1 AS Ordinal
      FROM A
      ORDER BY [Name]) AS A2

ORDER BY Ordinal
Run Code Online (Sandbox Code Playgroud)

来自MSDN:

在使用UNION,EXCEPT或INTERSECT运算符的查询中,只允许在语句末尾使用ORDER BY.此限制仅适用于在顶级查询中而不是在子查询中指定UNION,EXCEPT和INTERSECT的情况.

编辑:强制您需要将顺序应用于ORDER BY外部查询.我为两个查询添加了一个常量值列.

  • 除非* it *应用了`ORDER BY`子句,否则不能保证“ UNION ALL”(也不是“ UNION”)返回结果的顺序。 (2认同)
  • 不,这意味着它可以*从第一个查询返回第一行,然后从第二个查询返回第一行和第二行,然后从第一个查询返回第二,第三和第四行,从第二个查询返回第三行,然后第一个查询的其余行。而且,实际上,甚至不能保证以子查询的排序顺序返回它们-无论出于何种原因,它都可以选择对结果重新排序。如果外部查询中没有`ORDER BY`,则可以不考虑最终结果 (2认同)