Sql 从所有表中选择所有记录,每个派生表都必须有自己的别名

Sql 从所有表中选择所有记录,每个派生表都必须有自己的别名,sql,Sql,我正在进行一个电子学习项目,其中有一个名为chapter的表格,其中有一个名为question_table的列。这是一个表格,其中添加了特定章节的问题 现在的问题是,我想显示我在下面的sql查询中使用的所有章节中的所有问题 SELECT * FROM (SELECT `question_table` FROM `chapter`) 但它不起作用,并给出了错误: 每个派生表都必须有自己的别名 注意:我想用SQL而不是PHP来实现它。这里的派生表是SELECT的结果。。。。您需要给它一个别名,

我正在进行一个电子学习项目,其中有一个名为chapter的表格,其中有一个名为question_table的列。这是一个表格,其中添加了特定章节的问题

现在的问题是,我想显示我在下面的sql查询中使用的所有章节中的所有问题

  SELECT * FROM (SELECT `question_table` FROM `chapter`)
但它不起作用,并给出了错误:

每个派生表都必须有自己的别名


注意:我想用SQL而不是PHP来实现它。

这里的派生表是SELECT的结果。。。。您需要给它一个别名,如下所示:

SELECT * FROM (SELECT question_table FROM chapter) X;
编辑、重新创建动态表

如果您事先知道所有表,则可以合并它们,即:

SELECT * FROM 
(
  SELECT Col1, Col2, ...
     FROM Chapter1
  UNION
  SELECT Col1, Col2, ...
     FROM Chapter2
  UNION
  ...
) X;
一般来说,要使用此解决方案,您需要使用来实现您的目标

但是,通常情况下,这表明您的表格设计中有异味-您的章节数据实际上应该在一个表格中,例如,按章节id分类


如果出于规模或性能原因确实需要对数据进行切分,则执行此操作的典型机制是跨多个数据库,而不是跨同一数据库中的表。MySql可以处理每个表中的大量行,如果表被适当地索引,性能将不会成为问题。

在MySql中,您必须为每个子查询派生表提供一个别名:

SELECT * FROM (SELECT question_table FROM chapter) t --notice the alias "t"

首先,我认为你最好重新设计你的数据库。相同结构的多个表包含相同的数据通常不是一个好主意

但是,您需要的是使用MySQL过程来构建一些动态SQL,然后执行它,返回结果数据

可使用以下程序进行此操作:-

DROP PROCEDURE IF EXISTS dynamic;

delimiter // 

CREATE PROCEDURE dynamic()
BEGIN
    DECLARE question_table_value VARCHAR(25);
    DECLARE b INT DEFAULT 0;
    DECLARE c TEXT DEFAULT '';
    DECLARE cur1 CURSOR FOR SELECT `question_table` FROM `chapter`;
    DECLARE CONTINUE HANDLER FOR NOT FOUND SET b = 1;

    OPEN cur1;

    SET b = 0;

    WHILE b = 0 DO
        FETCH cur1 INTO question_table_value;
        IF b = 0 THEN
            IF c = '' THEN
                SET c = CONCAT('SELECT * FROM `',question_table_value, '`');
            ELSE
                SET c = CONCAT(c, ' UNION SELECT * FROM `',question_table_value, '`');
            END IF;
        END IF;
    END WHILE;

    CLOSE cur1;

    SET @stmt1 := c;
    PREPARE stmt FROM @stmt1;
    EXECUTE stmt;
END
这是创建一个名为dynamic的过程。这不需要参数。它设置一个光标,从章节表中读取问题表列值。它会查看结果,构建一个包含SQL的字符串,SQL是一个从每个表中选择并将结果联合在一起的字符串。然后准备并执行。该过程将返回默认执行的SQL的结果集

您可以使用以下方法调用此函数以返回结果:-

CALL dynamic()

不利的一面是,如果没有要返回的行,并且这些行不容易使用开发人员拥有的常规工具进行维护或调试,那么这将不会产生很好的结果。添加到以后很少有人有任何真正的存储过程技能来维护它。

这只给出了表名我想从每个表中选择所有数据还有其他方法吗?这只给出了表名我想从每个表中选择所有数据你的实际问题是什么?我想显示所有问题。我已经为每个章节创建了单独的表格,所以我想选择所有章节并从每个章节中选择所有问题chapter@RahulPrajapati虽然SO社区的许多成员看起来确实是通灵的,但我们并非都是如此。在MySQL中,这不可能作为一个单独的查询。您需要从表中进行选择,而不是从子查询返回表名。您需要动态构建sql,以便从联合在一起的每个表中进行选择。这可能在mysql过程中完成。@Kickstart我是mysql过程的新手。你能解释一下如何使用这个程序吗。