【问题标题】:JOIN to second database whose name is stored in the first in a SINGLE query加入第二个数据库,其名称存储在 SINGLE 查询中的第一个数据库中
【发布时间】:2021-05-27 07:12:00
【问题描述】:

我可以SELECT来自两个数据库的数据(具有适当的用户权限):

SELECT * 
FROM test1.table1 AS t1 
INNER JOIN test2.table2 AS t2 ON (t2.id = t1.id);

这将返回以下结果:

+----+-------+----+------------------------------------------+
| id | db    | id | info                                     |
+----+-------+----+------------------------------------------+
| 1  | test2 | 1  | Success if test2 db name was not static. |
+----+-------+----+------------------------------------------+

但是,我需要更改 INNER JOIN test2.table2 以在单个查询中使用 test1.table1.db 中指定的数据库。 db 可以根据JOIN 动态变化,所以我不能事先写。

如何使用一个数据库名称作为行值存储到JOIN 两个数据库中使用单个查询?

不幸的是,我没有特权来辩论这个优点。此外,我尝试了几个 MariaDB 小提琴,但都没有工作,所以这是我正在使用的测试代码:

数据库test1:

CREATE DATABASE `test1` /*!40100 COLLATE 'utf8mb4_unicode_520_ci' */

CREATE TABLE `table1` (`id` INT(11) NOT NULL AUTO_INCREMENT,
`db` VARCHAR(255) NULL DEFAULT NULL COLLATE 'utf8mb4_unicode_520_ci', PRIMARY KEY (`id`) USING BTREE)
COLLATE='utf8mb4_unicode_520_ci'
ENGINE=InnoDB;

INSERT INTO `table1` (`id`, `db`) VALUES (1, 'test2');

数据库test2:

CREATE DATABASE `test2` /*!40100 COLLATE 'utf8mb4_unicode_520_ci' */

CREATE TABLE `table2` (`id` INT(11) NOT NULL AUTO_INCREMENT,
`info` VARCHAR(255) NULL DEFAULT NULL COLLATE 'utf8mb4_unicode_520_ci', PRIMARY KEY (`id`) USING BTREE)
COLLATE='utf8mb4_unicode_520_ci' ENGINE=InnoDB;

INSERT INTO `table2` (`id`, `info`) VALUES (1, 'Success if test2 db name was not static.');

【问题讨论】:

  • 为什么有两个数据库?
  • Unfortunately I'm not in the privileged position to debate the merit of this.

标签: mysql join mariadb


【解决方案1】:

很遗憾,你不能这样做。

您必须通过查询 Table1 来查询数据库名称,然后使用该数据库名称动态构建查询,并单独执行第二个查询。

【讨论】:

  • 我不得不恭敬地不同意。虽然有准备好的语句允许我在从脚本语言到数据库的单个查询中尝试做的事情已经有一段时间了。我会在旧文档正常工作后发布答案。
  • 我的立场是正确的,谢谢你教我一些新东西!
【解决方案2】:

我需要一份准备好的陈述。对于经验不足的人来说,所有这些都将在单个数据库查询中工作,并允许动态JOIN 两个数据库。

SET @db = (SELECT db FROM test1.table1);

PREPARE stmt FROM CONCAT('SELECT * FROM test1.table1 AS t1 INNER JOIN ', @db, '.table2 AS t2 ON (t2.id = t1.id)');

EXECUTE stmt;

DEALLOCATE PREPARE stmt;

【讨论】:

  • 这1个查询怎么样?您所做的正是@Jeff 在他们的回答中描述的那样。
猜你喜欢
  • 2018-09-08
  • 1970-01-01
  • 2015-07-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多