【问题标题】:Parameterized table name参数化表名
【发布时间】:2018-08-11 12:26:41
【问题描述】:

这是我的问题:我想检查名称参数化的表中的行,例如table_X。 X 的值来自另一个表,因此例如在我的主表中,我有一个列 c_id 和一个列 X,要加入的表的名称为 table_X,它无疑是存在的,并且它具有相同的列 @987654324 @,我将加入,以检查该表中是否有 c_id 的值。

  1. 我尝试了一个视图,但没有成功,因为我无法在视图中放置参数化的表名。我可以参数化 where 子句和其他东西,但不能参数化表名。

  2. 我已经尝试了一个过程,

    SET @q = CONCAT('select blabla from table_', X);
    PREPARE stmt FROM @q;
    EXECUTE stmt;
    

    但是程序不能返回值,我需要它,因为我需要知道参数化表中是否有c_id值,否则它没有用。

  3. 我尝试了一个函数,但是“存储函数或触发器中不允许使用动态 SQL”

那么我该怎么做才能提取这些数据呢?我从 PHP 调用这个视图/函数/任何东西,我知道我可以从 PHP 端通过两个查询来完成它,但我需要在 db 端完成它,以便将来实现。 有可能吗?

注意:我不能修改 DB 的结构 :) 顺便说一句,它是 Limesurvey db,听起来像一个疯狂的 db 结构,对吧?

【问题讨论】:

  • 听起来您需要重构数据库以删除这些依赖项。

标签: mysql sql parameterized


【解决方案1】:

在不动态构建查询的情况下,唯一的方法是在每个组合中硬编码并挑选出你想要的。


如果表名是存储过程的参数,则可以在 IF 块中。但是感觉很笨重。


如果每个表中的字段相同,您可以将这些表合并在一起并从中进行选择...

CREATE VIEW myUnifiedStructure AS
      SELECT 'Table1' AS tableName, * FROM Table1
UNION SELECT 'Table2' AS tableName, * FROM Table2
UNION SELECT 'Table3' AS tableName, * FROM Table3
-- etc

SELECT * FROM myUnifiedStructure WHERE tableName = 'Table1'


如果每个表中的字段不同,您可能只对部分字段感兴趣...

CREATE VIEW myUnifiedStructure AS
      SELECT 'Table1' AS tableName, field1 AS field1, field4 AS field2 FROM Table1
UNION SELECT 'Table2' AS tableName, field2 AS field1, field3 AS field2 FROM Table2
UNION SELECT 'Table3' AS tableName, field2 AS field1, field4 AS field2 FROM Table3
-- etc


或者您可以为源表中不存在的字段传递 NULL...

CREATE VIEW myUnifiedStructure AS
      SELECT 'Table1' AS tableName, NULL   AS field1, field2 AS field2 FROM Table1
UNION SELECT 'Table2' AS tableName, field1 AS field1, field2 AS field2 FROM Table2
UNION SELECT 'Table3' AS tableName, field1 AS field1, NULL   AS field2 FROM Table3
-- etc

【讨论】:

  • 不幸的是,表名也是动态的,所以我不能对它们进行硬编码。但是,我知道是否以及何时创建新表(实际上是我创建它们),所以每次我都可以动态删除并重新创建将执行您建议的 UNION 的视图。伟大的!谢谢
【解决方案2】:

为什么需要这样的单独表格?这通常是糟糕设计的标志。为记录所属的 X` 值创建一个带有标识符字段的单个表不是更容易吗?可以加入/过滤?

这会将查询简化为类似

SELECT ...
FROM othertable
JOIN bigtable ON othertable.c_id = bigtable.c_id AND othertable.fieldName = bigtable.fieldName

【讨论】:

  • 是的,我知道,这是我看到它时首先想到的,但我没有设计数据库,而且我知道迟早那个糟糕的设计会给我带来问题.. . :(
猜你喜欢
  • 1970-01-01
  • 2010-09-27
  • 2018-09-05
  • 1970-01-01
  • 2019-09-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多