为什么我的派生表(子查询)不能有别名

时间:2019-09-11 02:40:50

标签: sql

很抱歉这个奇怪的问题。

我知道sql有一条规则,即“每个派生表都必须具有自己的别名”。例如: 这是错误的:

SELECT ID FROM (SELECT * FROM (SELECT * FROM IDs));

它应该是:

SELECT ID FROM 
(SELECT * FROM (SELECT * FROM IDs) 
AS alias) AS anotherAlias;

但是我的代码as alias是错误的:

SELECT ID FROM tableA
WHERE ID NOT IN
(SELECT ID FROM tableB) AS alias;

3 个答案:

答案 0 :(得分:1)

FROM子句中的子查询需要表别名。这样的子查询有时称为派生的表。所有派生表都需要一个别名-在某些(但不是全部)数据库中。

SELECT子句中,子查询也可以使用别名-但这是列别名。

在您的示例中,子查询不代表任何结果集或值,因此不需要别名。

答案 1 :(得分:0)

由于您没有将子查询用作表,因此将其用作IN子句中WHERE子句中的值的集合。

您的第一个示例在FROM子句中有子查询。

答案 2 :(得分:0)

考虑使用别名的原因。如果我写:

SELECT x.*
FROM x
INNER JOIN
(
SELECT *
FROM y
) ON x.id = ???

查询失败。我无法在派生表中引用任何字段。显然,此版本有效:

SELECT x.*
    , y.*
FROM x
INNER JOIN
(
SELECT *
FROM y
) y ON x.id = y.id

在上面,我需要为y加上别名,以便可以引用该派生表中的字段。

但是,下面提到的查询确实可以在没有别名的情况下运行:

SELECT *
FROM x
WHERE id IN (SELECT id FROM y)

那该查询为什么起作用?好吧,我们不需要子查询中任何字段的名称。我们只是将其作为列表引用。

这就是为什么我写:

SELECT *
FROM x
WHERE id IN (SELECT id, id2 FROM y)

我看到与子查询过多字段相关的错误。我们只能有一个。

有帮助吗?