关系数据库上的以下MySQL查询会生成错误"每个派生表都必须有自己的别名"。基于every derived table must have its own alias和Every derived table must have its own alias error。我给子查询中的每个表以及结合的结果表提供了别名。然而,这似乎没有解决它。有人能解释一下这里仍然缺少什么吗?
SELECT major
FROM
(SELECT major, count(*) amount
FROM
(((SELECT major
FROM
(SELECT tutorID
FROM questionAnsweredBy
AS t1)
NATURAL JOIN
(SELECT tutorID, major
FROM tutor
AS t2) AS t12
)
AS t3
UNION
(SELECT major
FROM
(SELECT tutorID
FROM expertAnswerGivenBy
AS t4)
NATURAL JOIN
(SELECT tutorID, major
FROM tutor
AS t5) AS t13
)
AS t6) AS t15
UNION
(SELECT major
FROM
(SELECT tutorID
FROM textbookSolutionGivenBy
AS t7)
NATURAL JOIN
(SELECT tutorID, major
FROM tutor
AS t8) AS t14
)
AS t9) AS t16
GROUP BY major
AS t10
)
AS t11
答案 0 :(得分:0)
NATURAL JOIN
右手参数子查询缺少别名。作为UNION
的参数的子查询不应该有别名。
FROM
参数为table
或table [AS] alias
或(select ...) [AS] alias
。非常常见的是在AS
子句中使用SELECT
作为列,但不在FROM
子句中使用它来表/子查询。 (并非所有DBMS都支持后者。)您可以链接UNION
而没有括号,与JOIN
s一样。
让我们垂直对齐子查询的括号。让我们垂直对齐SELECT
,FROM
,JOIN
,UNION
&带有参数缩进的GROUP BY
。
如果您想了解某些技术问题,start with the official documentation。
SELECT major
FROM
(SELECT major, count(*) AS amount
FROM
(
(SELECT major
FROM
(SELECT tutorID
FROM questionAnsweredBy t1
) nj1
NATURAL JOIN
(SELECT tutorID, major
FROM tutor t2
) t12
)
UNION
(SELECT major
FROM
(SELECT tutorID
FROM expertAnswerGivenBy t4
) nj2
NATURAL JOIN
(SELECT tutorID, major
FROM tutor t5
) AS t13
)
UNION
(SELECT major
FROM
(SELECT tutorID
FROM textbookSolutionGivenBy t7
) nj3
NATURAL JOIN
(SELECT tutorID, major
FROM tutor t8
) t14
)
) t16
GROUP BY major
) t10
PS 进一步简化:
您的group by
- count(*)
&最外层select
,因为后者只是撤消前者。无论如何,所有count(*)
都是1,因为major
结果中union
是唯一的。
对于作为基表名称的from
参数,您不需要select
。而且你不需要别名。特别是如果你从来没有点过它。您也不需要from
子选择别名,以区别于其祖先from
s'别名。使用一些标准名称/前缀表示未使用的别名,例如x
或dummy
,这是很常见的。
您似乎是从关系代数映射到SQL。据推测,您的基表没有重复的行,重复的列或null
。您也可以select * from
join
,除非您希望select
代表投影。理想情况下使用union corresponding
,但如果不支持,则明确列出列名,以便它们正确配对;总是或列可以按不同顺序排列。您需要通过select distinct
删除重复项;总是或者可能出现重复的地方 - select
非超级密钥。
SELECT major
FROM
(SELECT major, count(*) AS amount
FROM
(
(SELECT major
FROM questionAnsweredBy
NATURAL JOIN tutor
)
UNION
(SELECT major
FROM expertAnswerGivenBy
NATURAL JOIN tutor
)
UNION
(SELECT major
FROM textbookSolutionGivenBy
NATURAL JOIN tutor
)
) x
GROUP BY major
) x