每个派生 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 参数是 tabletable [AS] alias(select ...) [AS] alias。很常见的是在 SELECT 列的子句中使用 AS 但不在 tables/subqueries 的 FROM 子句中使用它。 (并非所有 DBMS 都支持后者。)您可以在不带括号的情况下链接 UNIONs,如 JOINs.

让我们垂直对齐子查询的括号。让我们垂直对齐 SELECTFROMJOINUNIONGROUP 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,因为 majorunion 结果中是唯一的。

对于 from 以 table 为基础的参数,您不需要 select。而且您不需要别名。特别是如果你从不点它。您也不需要 from 子选择别名来区别于其祖先 from 的别名。通常使用一些标准 name/prefix 来表示未使用的别名,例如 xdummy

您似乎是从关系代数映射到 SQL。大概你的基础 tables 没有重复的行、重复的列或 nulls。你也可以 select * from joins 除非你想让 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