使用SQL按顺序查询,第一条记录除外
我有个主意,例如,我有一张桌子,里面有安、本、克里斯、汤姆、约翰、, 我想使用sql查询它,从字母a开始,最后是字母z 但我有一个条件,我想把约翰放在第一张唱片里使用SQL按顺序查询,第一条记录除外,sql,Sql,我有个主意,例如,我有一张桌子,里面有安、本、克里斯、汤姆、约翰、, 我想使用sql查询它,从字母a开始,最后是字母z 但我有一个条件,我想把约翰放在第一张唱片里 (SELECT * FROM atable WHERE username = 'John') UNION ALL (SELECT * FROM atable WHERE username <> 'John' ORDER BY username) 如果出于某种原因必须避免联合,则此较慢的代码也会起作用: SELEC
(SELECT * FROM atable WHERE username = 'John')
UNION ALL
(SELECT * FROM atable WHERE username <> 'John' ORDER BY username)
如果出于某种原因必须避免联合,则此较慢的代码也会起作用:
SELECT * FROM atable
ORDER BY
CASE WHEN id IN (SELECT id FROM atable ORDER BY username DESC LIMIT 1)
THEN 0 ELSE 1 END
, username
在SQL server中,语法略有不同,子查询为:
SELECT TOP 1 id FROM atable ORDER BY username DESC
这很简单:
(SELECT Name
FROM Users
WHERE Name = 'John')
UNION ALL
(SELECT *
FROM Users
WHERE Name <> 'John'
ORDER BY Name)
在order by子句中放置case语句不适用于select distinct。我发现下面的方法更直观,如果您还需要选择distinct,那么它也可以工作。尽管它确实会在结果集中返回一个额外的列
DECLARE @names TABLE
(
Name varchar(20)
)
INSERT INTO @names
SELECT 'Tom'
INSERT INTO @names
SELECT 'John'
INSERT INTO @names
SELECT 'Chris'
INSERT INTO @names
SELECT 'Ann'
INSERT INTO @names
SELECT 'Ben'
select Name, case when Name = 'John' then 1 else 0 end AS IsTopRow
from @names
order by IsTopRow DESC, Name
结果:
Name IsTopRow
John 1
Ann 0
Ben 0
Chris 0
Tom 0
由于缺少外部order by,服务器仍然可以混合来自两个联合的行。将联合更改为UNION ALL,您将合并两个互斥集。您将选择用户john两次。我同意bluefeet。此外,如果有人不回答您的问题,请自己回答。可能重复的您不需要在此处使用外部查询来选择联合的结果吗?由于缺少外部排序依据,服务器仍然可以混合来自两个联合的行。@GSerg,不,不是,也不会。@Johan通常不会。但它可能与SQL标准的定义相同。当您不按顺序从表中选择记录时,它们将按聚集键的顺序返回,因为这样更便宜,但服务器仍可以按任何其他顺序返回它们。@不,您不需要外部选择,您永远不需要使用union的其他选择,除非你想在组合集合上做额外的魔法。这个例子比where+并集快吗?我认为有了一个像样的索引,where+union可能会更快。@aF,避免union本身并不是一个目标,尤其是如果你可以使用union ALL,这可以避免昂贵的重复检查。union ALL确实更好,但我喜欢这种开箱即用的方法:
DECLARE @names TABLE
(
Name varchar(20)
)
INSERT INTO @names
SELECT 'Tom'
INSERT INTO @names
SELECT 'John'
INSERT INTO @names
SELECT 'Chris'
INSERT INTO @names
SELECT 'Ann'
INSERT INTO @names
SELECT 'Ben'
select Name, case when Name = 'John' then 1 else 0 end AS IsTopRow
from @names
order by IsTopRow DESC, Name
Name IsTopRow
John 1
Ann 0
Ben 0
Chris 0
Tom 0