Sql server 如何在顶部不按顺序显示特定的2行,然后使用SQL DISTINCT、UNION按顺序对其余行进行排序

Sql server 如何在顶部不按顺序显示特定的2行,然后使用SQL DISTINCT、UNION按顺序对其余行进行排序,sql-server,distinct,union,Sql Server,Distinct,Union,我有一个Id为、名称为且记录重复的国家/地区表。我使用DISTINCT和UNION在顶部显示特定的两个国家名称爱尔兰和英格兰,其余国家名称在SQL server中按顺序显示,如下所示 create table country (id int , name varchar(50)); insert into country (id, name) values( 1, 'Kuwait'); insert into count

我有一个Id为、名称为且记录重复的国家/地区表。我使用DISTINCT和UNION在顶部显示特定的两个国家名称爱尔兰和英格兰,其余国家名称在SQL server中按顺序显示,如下所示

create table country (id int , name varchar(50));                      
insert into country (id, name) values( 1, 'Kuwait');                
insert into country (id, name) values( 2, 'Australia');             
insert into country (id, name) values( 3, 'Canada');
insert into country (id, name) values( 4, 'spain');
insert into country (id, name) values( 5, 'Turkey'); 
insert into country (id, name) values( 6, 'Ireland');
insert into country (id, name) values( 7, 'England');
insert into country (id, name) values( 1, 'Kuwait');                
insert into country (id, name) values( 2, 'Australia');             
insert into country (id, name) values( 3, 'Canada');
insert into country (id, name) values( 4, 'spain');
insert into country (id, name) values( 5, 'Turkey'); 
insert into country (id, name) values( 6, 'Ireland');
insert into country (id, name) values( 7, 'England');
DESIRED OUTPUT:
id    name 
-----------
  6   Ireland
  7   England
  2   Australia
  3   Canada
  1   Kuwait
  4   Spain
  5   Turkey 
尝试在SQL查询中使用DISTINCT&UNION:但名称不在3行之后排序

 select distinct id,name from country where id in (6,7)
 union
 select distinct id,name from country where id not  in (6,7)

 id   name 
-----------
  6   Ireland
  7   England
  1   Kuwait
  2   Australia
  3   Canada
  4   Spain
  5   Turkey `
也按案件顺序审理:

  select distinct id,name from country where id in (6,7)
  union
  select distinct id,name from country where id not  in (6,7)
  ORDER BY CASE 
  WHEN id = 6 and id = 7  -- whatever identifies that row
  THEN 1 ELSE 2 END

错误:如果语句包含UNION、INTERSECT或EXCEPT运算符,则ORDER BY项必须出现在选择列表中。

除非指定ORDER BY,否则返回结果的顺序绝对没有保证。即使您在下一次运行、明天或在客户端站点上找到一个按所需顺序返回行的查询,它也不会按相同顺序返回行。因此,您必须添加ORDERBY子句。您需要对一些人工值进行排序,如下所示:

declare  @country table(id int , name varchar(50));                      
insert into @country (id, name) values( 1, 'Kuwait');                
insert into @country (id, name) values( 2, 'Australia');             
insert into @country (id, name) values( 3, 'Canada');
insert into @country (id, name) values( 4, 'spain');
insert into @country (id, name) values( 5, 'Turkey'); 
insert into @country (id, name) values( 6, 'Ireland');
insert into @country (id, name) values( 7, 'England');
insert into @country (id, name) values( 1, 'Kuwait');                
insert into @country (id, name) values( 2, 'Australia');             
insert into @country (id, name) values( 3, 'Canada');
insert into @country (id, name) values( 4, 'spain');
insert into @country (id, name) values( 5, 'Turkey'); 
insert into @country (id, name) values( 6, 'Ireland');
insert into @country (id, name) values( 7, 'England');

select id, name from (
select distinct id, name
from @country) t
order by case name when 'Ireland' then 'aaaaaaaaaaaaaaaaaaaaaaaa1' when 'England' then 'aaaaaaaaaaaaaaaaaaaaaaaa2' else name end

按案例订购应该是解决方案。您不需要筛选id并使用UNION。只需选择distinct id、name from country+您的订单案例语句。如果您需要在这之后排序,您只需输入一个逗号,并使用id或名称。选择distinct id,当id=6和id=7时,按国家顺序按大小写的名称,然后选择1或2结束给定错误:如果指定select distinct,则按项目排序必须出现在选择列表中。好的,然后将distinct放入子查询中,如Andrey Nikolov的回答谢谢,大卫。安德烈·尼科洛夫(Andrey Nikolov)的查询返回了正确的答案,但如果我们得到更好的答案,我们将等待。再次感谢。如果你想点名的话,这是一个正确的答案。如果您想按id排序,您需要将您的CASE表达式+,id放入,这是一个聪明的解决方案。为了澄清,您可以提到子查询的原因,这样人们就会知道,否则他们将得到一个错误“如果指定了select DISTINCT,则ORDER BY items必须出现在select列表中”。避免子查询和distinct的一种可能的方法是添加GROUP BY id、NameThank和Andrew。它完全符合我的要求。