对联合的两个部分进行相互独立的排序



是否可以做这样的事情:

select name from table1 order by name
union
select name from table2 order by name

我知道我可以这样做:

select name from table1
union
select name from table2 order by name

但是,我希望表1中的名称首先出现。 我花了最后一个小时在谷歌上搜索这个,但我无处可去。 例如,我在这里看过:如何在SQL中使用联合排序?

查询需要稍微复杂一些:

select name
from ((select distinct name, 1 as is_1 from table1) 
union
(select distinct name, 0 from table2)
) n
group by name
order by max(is_1), name;

这会在子查询中使用select distinct,因为这可以利用name上的索引。

添加一个"sort"字段,并将union放在子查询中,以便您可以在并集之后进行排序。

未经测试

select a.name
from (
select name, 1 sort
from table1
union all
select name, 2 sort
from table2
) a
order by a.sort, a.name

我将其更改为union all以明确这种方法不会union。 如果要查看sort列,也可以选择它。 如果您不想要重复的名称,则此方法将不起作用。

您需要另一列进行排序。UNION 不允许单个查询具有 ORDER BY 子句。

在名称之前添加要排序的列允许它对各个结果集进行排序。请参阅下面的示例:

CREATE TABLE #Table1 (Name VARCHAR(50))
CREATE TABLE #Table2 (Name VARCHAR(50))
INSERT INTO #Table1 VALUES ('Bart'), ('Lisa'), ('Maggie')
INSERT INTO #Table2 VALUES ('Chris'), ('Meg'), ('Stewie')
SELECT Name, 0 AS Sort FROM #Table1
UNION
SELECT Name, 1 AS Sort FROM #Table2
ORDER BY Sort, Name

最新更新