【问题标题】:MariaDB, how to use a field name as a table name?MariaDB,如何使用字段名作为表名?
【发布时间】:2017-05-24 14:15:18
【问题描述】:

我正在尝试创建一个可以引用另一个表的表,它所引用的表在其中一条记录中配置:

规则表'tblRules':

    biRuleID, BIGINT, Unsigned, Primary Key
    biTableID, BIGINT, Unsigned, Link to record in 'other' table
    vcDescription, VARCHAR[64], Description of rule
    vcTableName, VARCHAR[64], The name of the table containing the rule details.

一个测试表,'tblTest':

    biTestID, BIGINT, Unsigned, Primary Key
    vcTest, VARCHAR[64], A test string

为了测试,tblRules 包含一条记录:

    1, 1, Testing rule, tblTest

而 tblTest 包含:

    1, Hello World

现在我要拉入数据:

    SELECT
      * 
    FROM 
      tblRules t1 
    LEFT JOIN 
      t1.vcTableName t2 
    ON 
      t1.biTableID=t2.biTestID 
    WHERE 
      t1.biRuleID=1;

但是,当我尝试执行查询时,它似乎将 t1.vcTableName 作为表的名称而不是 vcTableName 包含的内容,有没有办法解决这个问题?

【问题讨论】:

  • 我不是 MariaDB 用户,但通常这件事(使用查询本身的列中的值)在 SQL 中是不可能的(实际上可能违反 SQL 标准)。您需要以某种方式获取元数据,或者使用 SQL 之上的语言,或者使用 EXECUTE IMMEDIATE 动态生成和执行 SQL 语句。
  • 这种问题是设计不佳的表现
  • 我的目标是完全的灵活性和可扩展性

标签: mysql sql mariadb


【解决方案1】:

你可以使用动态 sql 来实现它,虽然我认为你必须对你的数据库设计做一些事情,因为这不是太有效

set @qry = (
    SELECT
      concat('SELECT * FROM tblRules t1 LEFT JOIN ', t1.vcTableName, ' t2 ON t1.biTableID = t2.biTestID WHERE t1.biRuleID=1') 
    FROM 
      tblRules t1 
    WHERE 
      t1.biRuleID=1
);
PREPARE qry FROM @qry;
EXECUTE qry;
DEALLOCATE PREPARE qry;

【讨论】:

  • 谢谢,我今晚会试试这个并回帖。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-08
  • 1970-01-01
  • 2011-06-08
  • 1970-01-01
  • 2023-03-04
  • 2016-08-27
相关资源
最近更新 更多