很抱歉这个奇怪的问题。
我知道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;
答案 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)
我看到与子查询过多字段相关的错误。我们只能有一个。
有帮助吗?