每个派生 table 必须有自己的别名,但是给所有子查询的别名会出错
Every derived table must have its own alias, but alias given to all sub-queries gives error
以下对关系数据库的 MySQL 查询生成错误 "Every derived table must have its own alias"。基于 every derived table must have its own alias and Every derived table must have its own alias error。我为子查询中的每个 table 和联合的结果 table 赋予别名。然而,这似乎并没有解决问题。有人可以解释这里还缺少什么吗?
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
NATURAL JOIN
右侧参数子查询缺少别名。作为 UNION
参数的子查询不应有别名。
一个 FROM
参数是 table
或 table [AS] alias
或 (select ...) [AS] alias
。很常见的是在 SELECT
列的子句中使用 AS
但不在 tables/subqueries 的 FROM
子句中使用它。 (并非所有 DBMS 都支持后者。)您可以在不带括号的情况下链接 UNION
s,如 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
以 table 为基础的参数,您不需要 select
。而且您不需要别名。特别是如果你从不点它。您也不需要 from
子选择别名来区别于其祖先 from
的别名。通常使用一些标准 name/prefix 来表示未使用的别名,例如 x
或 dummy
。
您似乎是从关系代数映射到 SQL。大概你的基础 tables 没有重复的行、重复的列或 null
s。你也可以 select * from
join
s 除非你想让 select
代表一个投影。理想情况下使用 union corresponding
但如果不支持则显式列出列名以便它们正确配对; always 或 where columns can be in different order.您需要通过 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
以下对关系数据库的 MySQL 查询生成错误 "Every derived table must have its own alias"。基于 every derived table must have its own alias and Every derived table must have its own alias error。我为子查询中的每个 table 和联合的结果 table 赋予别名。然而,这似乎并没有解决问题。有人可以解释这里还缺少什么吗?
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
NATURAL JOIN
右侧参数子查询缺少别名。作为 UNION
参数的子查询不应有别名。
一个 FROM
参数是 table
或 table [AS] alias
或 (select ...) [AS] alias
。很常见的是在 SELECT
列的子句中使用 AS
但不在 tables/subqueries 的 FROM
子句中使用它。 (并非所有 DBMS 都支持后者。)您可以在不带括号的情况下链接 UNION
s,如 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
以 table 为基础的参数,您不需要 select
。而且您不需要别名。特别是如果你从不点它。您也不需要 from
子选择别名来区别于其祖先 from
的别名。通常使用一些标准 name/prefix 来表示未使用的别名,例如 x
或 dummy
。
您似乎是从关系代数映射到 SQL。大概你的基础 tables 没有重复的行、重复的列或 null
s。你也可以 select * from
join
s 除非你想让 select
代表一个投影。理想情况下使用 union corresponding
但如果不支持则显式列出列名以便它们正确配对; always 或 where columns can be in different order.您需要通过 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