mariadb 从多个未知表中选择列

8gsdolmq  于 2022-11-08  发布在  其他
关注(0)|答案(1)|浏览(140)

我有许多根据“前缀+数字”方案动态创建的外观几乎相似的表,例如“t1”、“t2”、“t343”等。所有这些表都有一个名为identifier的跨表唯一行,我喜欢在一个查询中选择它:

SELECT
  `identifier`
FROM
(
  SELECT
    `TABLE_NAME`
  FROM
    information_schema.TABLES
  WHERE
    `TABLE_NAME` LIKE 't%'
);

但这返回:错误1248(42000):每个派生表都必须有自己的别名
EDIT:根据注解我这样修改了我的查询:

SELECT
  A.identifier
FROM
(
  SELECT
    `TABLE_NAME` AS identifier
  FROM
    information_schema.TABLES
  WHERE
    `TABLE_NAME` LIKE 't%'
) A;

但这只会从子查询中选择表名,而不会从这些表中选择列identifier

5gfr0r5j

5gfr0r5j1#

当您动态建立数据表,而且想要查询所有数据表时,可以动态建立SQL陈述式,例如:

select
   group_concat(
   concat(
       'SELECT ',
       '''',TABLE_SCHEMA,'.',TABLE_NAME,''',',
       TABLE_SCHEMA,'.',TABLE_NAME,'.', COLUMN_NAME,
       ' FROM ',
       TABLE_SCHEMA,'.',TABLE_NAME)
      separator ' union all ')
from information_schema.`COLUMNS` c  
where table_schema='test'             -- the schema name where your tables are
  and table_name  regexp '^t[0-9]+$'  -- table name starts with t and ends with number
  and COLUMN_NAME = 'i'               -- i choose `i` as the column to be selected
;

这将生成如下所示的SQL语句:

select
    'test.t1',
    test.t1.i
from
    test.t1
union all
select
    'test.t2',
    test.t2.i
from
    test.t2
union all
select
    'test.t3',
    test.t3.i
from
    test.t3

当将所有这些都放在存储过程中时,可以使用PREPAREEXECUTE来执行创建的语句。
上面只是一个SQL语句的例子,你应该根据自己的需要修改它。

相关问题