UNION中ORDER BY的使用

SQL UNION的语法

1. SELECT columnname(s) FROM tablename1
2. UNION
3. SELECT columnname(s) FROM tablename2

注释:默认地,UNION 操作符选取不同的值。如果允许重复的值,请使用 UNION ALL。
*      SQL UNION ALL 语法*

1. SELECT columnname(s) FROM tablename1
2. UNION ALL
3. SELECT columnname(s) FROM tablename2

另外,UNION 结果集中的列名总是等于 UNION 中第一个 SELECT 语句中的列名。

UNION中ORDER BY的使用

You have to use the Order By at the end of ALL the unions。
the ORDER BY is considered to apply to the whole UNION result(it's effectively got lower binding priority than the UNION). The ORDER BY clause just needs to be the last statement, after you've done all your unioning. You can union several sets together, then put an ORDER BY clause after the last set.
所以,只能在union的最后一个子查询中使用order by,而这个order by是针对整个unioning后的结果集的

例如:

1. select supplierid, suppliername
2. from suppliers
3. UNION
4. select companyid, companyname
5. from companies
6. ORDER BY ?;

这里的问号如果是companyname,则执行整个查询会报“companyname:invalid identifier”(当然,单独执行第二个含order by的子查询是没有问题的);这是因为unioning后结果集的列名是以第一个参加union的子查询的列名为准的;order by针对的是整个unioning后的结果集。对整个查询结果来说,无”companyname“这个字段
如果是supplier
name,则单独执行第二个含order by的子查询是会报“suppliername:invalid identifier”的,而执行整个查询是没有问题的,因为order by针对的是unioning后的整个结果集,而这“整个结果集”是有suppliername这列的(以第一个union子查询的列名作为unioning后整个结果集的列名)

为了避免这样事情的发生,可以:

1 使用列序号代替实际列名。如:

SQL代码:

1. select supplierid, suppliername
2. from suppliers
3. UNION  a;
4. select companyid, companyname
5. from companies
6. ORDER BY 2;

2 为unoin的各个子查询使用相同的列名,如:

SQL代码:

1. select supplierid as id, suppliername as name
2. from suppliers
3. UNION
4. select companyid as id, companyname as name
5. from companies
6. ORDER BY name;

这样,不管是执行整个查询还是单独执行包含order by的最后一个union子查询,都不会有问题。

comments powered by Disqus