这是我的问题:我想检查名称已参数化的表中的行,如table_X。X的值来自另一个表,例如,在我的主表中,我有一列c_id和一列X,要连接的表的名称为table_X,毫无疑问,它存在,并且具有相同的column c_id,我将其连接,以检查c_id该表中是否有值。
table_X
c_id
我尝试过一个视图,但是没有成功,因为我无法在视图中放置参数化的表名。我可以参数化where子句和其他东西,但是没有表名。
我已经尝试过一个程序
SET @q = CONCAT('select blabla from table_', X);
PREPARE stmt FROM @q; EXECUTE stmt;
但是过程无法返回值,所以我需要它,因为我需要知道c_id参数化表中是否存在该值,否则就没有用了。
那我该怎么做才能提取这些数据呢?我从PHP调用此视图/函数/任何东西,我知道我可以从PHP端通过两个查询来做到这一点,但对于将来的实现,我需要在db端做到这一点。是否有可能?
注意:我不能修改数据库的结构:)顺便说一句,它是Limesurvey数据库,听起来像是疯狂的数据库结构,是吗?
无需动态构建查询的唯一方法是对每种组合进行硬编码,然后选择所需的组合。
如果表名是存储过程的参数,则可以在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