2

询问:

SELECT * FROM station

输出:

id | stationname | total
-------------------------
 1 | Khar        | 5
 2 | SantaCruz   | 3
 3 | Sion        | 2
 4 | VT          | 1
 5 | newFort     | 3
 6 | Bandra      | 2
 7 | Worli       | 1
 8 | Sanpada     | 3
 9 | Joe         | 2
10 | Sally       | 1
11 | Elphiston   | 2
12 | Currey Road | 1

是否可以显示所有记录,但条件是在第一个位置及以下显示特定记录,然后显示其余所有记录

例如我的where情况是

where id=10

期望的输出:

id | stationname | total
-------------------------
10 | Sally       | 1
 1 | Khar        | 5
 2 | SantaCruz   | 3
 3 | Sion        | 2
 4 | VT          | 1
 5 | newFort     | 3
 6 | Bandra      | 2
 7 | Worli       | 1
 8 | Sanpada     | 3
 9 | Joe         | 2
11 | Elphiston   | 2
12 | Currey Road | 1

任何想法,提示将不胜感激

4

2 回答 2

3

您可以使用以下方式合并两个不同的查询UNION ALL

SELECT * FROM Station WHERE ID=10
UNION ALL
SELECT * FROM Station WHERE ID<>10

看到这个 SQLFiddle


更新(与退货相关的订单未定义

如果您看到两个查询的执行计划(usingUNIONUNION ALL),查询 usingUNION将对结果进行排序,而 query usingUNION ALL不会对结果进行排序。请参阅此 SQLFiddle中两个查询的执行计划。

UNION使用查询的执行计划:

在此处输入图像描述

UNION ALL使用查询的执行计划:

在此处输入图像描述

我从SQL SERVER 中找到了这个——UNION 和 UNION ALL 的介绍和示例

于 2012-11-24T10:48:18.517 回答
3

在 OP 提出的情况下使用 aUNION ALL可能有效,但会带来一些陷阱,如果不加选择地使用可能会导致意外结果。

搜索排序顺序可以缓解这些问题,前提是id可以选择 an 来保证列表中的第一个(本例中为 0)

SELECT * 
FROM   Station 
ORDER BY
       CASE WHEN id = 10 THEN 0 ELSE id END

请参阅此 SQLFiddle (对 hiss056 进行设置以进行设置)

于 2012-11-24T10:59:07.410 回答