【发布时间】:2020-04-04 04:12:30
【问题描述】:
假设我有多个具有相同架构的表:
CREATE TABLE `tbl01`
(
`id` INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
`name` TINYTEXT,
`data` INT
);
CREATE TABLE `tbl02`
(
`id` INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
`name` TINYTEXT,
`data` INT
);
CREATE TABLE `tbl03`
(
`id` INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
`name` TINYTEXT,
`data` INT
);
-- etc. ------------------
INSERT INTO `tbl01` (`name`, `data`) VALUES
('row 1', 1),
('row 2', 1),
('row 3', 3);
INSERT INTO `tbl02` (`name`, `data`) VALUES
('cube', 1),
('circle', 0);
INSERT INTO `tbl03` (`name`, `data`) VALUES
('one', 1);
然后是一个表,其中一列中包含所有其他表的名称:
CREATE TABLE `AllTbls`
(
`id` INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
`tblnm` VARCHAR(64) NOT NULL UNIQUE,
`desc` TINYTEXT,
`flgs` BIGINT UNSIGNED
);
INSERT INTO `AllTbls` (`tblnm`, `desc`, `flgs`) VALUES
('tbl01', 'Table 1', 0),
('tbl02', 'Table two', 1),
('tbl03', '3rd table', 0);
因此,如果我想编写一个查询来检索 AllTbls 的内容,并在一列中包含每个相应表中的行数,我认为以下方法是这样做的:
SELECT *, `tblnm` as TblName, (SELECT COUNT(*) FROM TblName) as cntRws
FROM `AllTbls` ORDER BY `id` ASC LIMIT 0,30;
但这会返回错误:
#1146 - 表 'database.TblName' 不存在
我知道我可以在多个查询中执行此操作(使用编程语言中的循环),但是否可以在一个查询中执行此操作?
PS。我正在使用MySQL v.5.7.28
【问题讨论】:
-
是否可以通过某些您无法控制的外部进程随时创建新表?
-
@CaiusJard 是的,他们可以随时添加。
-
如果没有动态 SQL,您将无法做到这一点。
-
@TimBiegeleisen 和
dynamic SQL是什么?当我用一种编程语言“即时”编写它时。 -
我认为您不能使用/插入 SELECTED 字段作为 FROM 参数。如果您探索信息模式的上层查询,也许可以?