首页 > 解决方案 > 使用 SQL 集合论子句时何时需要别名?

问题描述

我刚开始学习 SQL,并试图从我的错误中学习。在我的一次练习中,我不得不name从数据库中找到 city scities没有列为数据库中的capital城市countries。最初我尝试了下面的代码,但它产生了一个错误。

SELECT name
FROM cities 
EXCEPT
SELECT capital
FROM countries
ORDER BY capital ASC;

正确的代码是:

SELECT city.name
FROM cities AS city
EXCEPT
SELECT country.capital
FROM countries AS country
ORDER BY name;

有人可以向我解释为什么混叠在这里有很大的不同吗?

标签: sqlpostgresql

解决方案


UNION、EXCEPT 或 INTERSECT 的一个ORDER BY对完整结果进行排序。整个查询的列名由第一个查询定义。所以这个查询:

SELECT name
FROM cities 
EXCEPT
SELECT capital
FROM countries

返回一个包含名为 的单列的结果name

添加 anorder by在概念上与以下内容相同:

select *
from (
  SELECT name
  FROM cities 
  EXCEPT
  SELECT capital
  FROM countries
) x 
order by ....;

由于内部查询只返回一个列name,这是您可以在order by.

您在第二个查询中使用的别名不会更改整体结果的列名,这决定了该order by子句可用的列名。


推荐阅读