每个派生表必须具有自己的别名,但是给予所有子查询的别名会产生错误

时间:2017-11-24 08:36:06

标签: mysql subquery relational-database alias

关系数据库上的以下MySQL查询会生成错误"每个派生表都必须有自己的别名"。基于every derived table must have its own aliasEvery 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

1 个答案:

答案 0 :(得分:0)

NATURAL JOIN右手参数子查询缺少别名。作为UNION的参数的子查询不应该有别名。

FROM参数为tabletable [AS] alias(select ...) [AS] alias。非常常见的是在AS子句中使用SELECT作为列,但不在FROM子句中使用它来表/子查询。 (并非所有DBMS都支持后者。)您可以链接UNION而没有括号,与JOIN s一样。

让我们垂直对齐子查询的括号。让我们垂直对齐SELECTFROMJOINUNION&带有参数缩进的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'别名。使用一些标准名称/前缀表示未使用的别名,例如xdummy,这是很常见的。

您似乎是从关系代数映射到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