14

のようなクエリを書きたい

    select top 10 * from A
    order by price
    union
    select top 3 * from A 
    order by price

またはそのような

    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 

手伝ってくれませんか?

4

5 に答える 5

22

これはうまくいくはずです:

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

MSDNから:

UNION、EXCEPT、または INTERSECT 演算子を使用するクエリでは、ORDER BY はステートメントの末尾でのみ許可されます。この制限は、UNION、EXCEPT、および INTERSECT をサブクエリではなくトップレベル クエリで指定した場合にのみ適用されます。

編集済みORDER BY:外側のクエリに適用する必要がある順序を強制するには。両方のクエリに定数値列を追加しました。

于 2012-11-19T13:32:47.287 に答える
4

これは、これを行うための本当にハックな方法です。おそらく、実際にはこれらを個別のクエリとして使用する必要がありますが、これにより、必要な結果が得られるはずです...

select *
from (
  select top 10 *, 1 as 'ord', price as 'ordprice' from A
  union 
  select top 3 *, 2 as 'ord', 0 as 'ordprice' from A
) a
order by ord, ordprice, name
于 2012-11-19T13:32:55.083 に答える
2

UNION は、UNIONed 式の ORDER by 句を好みません。これを試して:

SELECT * FROM
   (SELECT TOP 10 * FROM A ORDER BY Price) SetA
UNION
SELECT * FROM
   (SELECT TOP 3 * FROM a ORDER BY name) Setb
[ORDER BY something]

これにより、UNION 演算子が ORDER BY を無視するように偽装されますが、TOP 演算子では引き続き正しく動作します。必要に応じて、最終的な ORDER BY を適用して UNIONed セットを並べ替えることができます。

[編集されたので、あなたの質問には正確には当てはまりません!]

于 2012-11-19T13:36:57.947 に答える
0
select top 10 *,0 as RS from A
union
select top 3 *,1 as RS from A 
order by
    RS,
    CASE WHEN RS=0 THEN price END, --Don't affect RS 1
    name
于 2012-11-19T13:33:37.037 に答える