Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用SQL按顺序查询,第一条记录除外_Sql - Fatal编程技术网

使用SQL按顺序查询,第一条记录除外

使用SQL按顺序查询,第一条记录除外,sql,Sql,我有个主意,例如,我有一张桌子,里面有安、本、克里斯、汤姆、约翰、, 我想使用sql查询它,从字母a开始,最后是字母z 但我有一个条件,我想把约翰放在第一张唱片里 (SELECT * FROM atable WHERE username = 'John') UNION ALL (SELECT * FROM atable WHERE username <> 'John' ORDER BY username) 如果出于某种原因必须避免联合,则此较慢的代码也会起作用: SELEC

我有个主意,例如,我有一张桌子,里面有安、本、克里斯、汤姆、约翰、, 我想使用sql查询它,从字母a开始,最后是字母z

但我有一个条件,我想把约翰放在第一张唱片里

  (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