选择具有特定模式的查询,在第一位显示特定记录

时间:2012-11-24 10:38:48

标签: sql-server sql-server-2008 tsql

查询:

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

是否可以显示所有记录,但条件是在第1位及以下显示特定记录,然后显示所有记录

E.g。我的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

任何想法,提示都将受到赞赏

2 个答案:

答案 0 :(得分:3)

您可以使用UNION ALL结合两个不同的查询,如下所示:

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

See this SQLFiddle


更新(与returned order is undefined相关)

如果您看到两个查询的执行计划(使用UNIONUNION ALL),则使用UNION的查询将对使用UNION ALL的查询的结果进行排序strong>不对结果进行排序。查看两个查询的执行计划in this SQLFiddle

使用UNION查询执行计划:

enter image description here

使用UNION ALL查询执行计划:

enter image description here

我是从SQL SERVER – Introduction and Example of UNION and UNION ALL

找到的

答案 1 :(得分:3)

使用UNION ALL可以在OP提供的案例中起作用,但是在使用时会出现一些可能导致意外结果的陷阱。

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

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

See this SQLFiddle (cudo's to hims056 for up up)