【发布时间】:2018-01-02 13:55:29
【问题描述】:
我如何使用列值作为数据库名称到JOIN这两个不同数据库中的两个表?
我已经使用静态定义的(第二个)数据库名称成功地连接了两个数据库之间的两个表:
SELECT *
FROM db1.table_a AS ta
INNER JOIN db2.table_b AS tb on (ta.db_table_name = b.user_id)
但是,db2.table_b 在该查询中的位置我需要以某种方式让db2 成为第一个数据库中第一个表的值; 表名 将被静态定义。所有这类相关的线程都完全没用,而且非常复杂。
详细信息:有一个通用数据库,所有其他数据库都代表相同的应用程序,但用于不同的帐户。为了使所有不同帐户上的所有用户能够相互交互(例如 database_2.accounts.user.43 (DB->Table->Column->ID (43)),公共数据库(@ 987654326@以上)不仅要存储用户的id,还要存储必须加入的数据库的名称。
为了帮助可视化事物:
- 数据库:通用
- 数据库:db2
SELECT id, database_name
FROM common.table_a AS ct
INNER JOIN [database_name].table_b AS dn ON (ct.user_id = [database_name].users.id)
返回的数据看起来应该是这样的:
+----------+------------+----------+
| database | account_id | username |
+----------+------------+----------+
| db1 | 1 | John |
+----------+------------+----------+
| db2 | 1 | Sally |
+----------+------------+----------+
| db3 | 43 | John |
+----------+------------+----------+
| db4 | 1 | Sally |
+----------+------------+----------+
那么 HTML 输出应该是这样的:
- 来自 db1 的 John 的评论。
- 来自 db2 的 Sally 的评论。
- 来自 db3 的 John 的评论。
- 来自 db4 的 Sally 的评论。
我可以担心在视觉上确保 db1 中的 John 和 db3 中的 John(以及 db2 中的 Sally 和 db4 中的 Sally)这四个人在现实生活中都是不同的人。重要的是根据包含要用于 JOIN 的数据库名称的列值的值来选择它们的动态方面。
【问题讨论】:
-
我没有完全理解,但这听起来你需要为此使用一些动态 SQL。
-
@TimBiegeleisen 每个数据库都有自己的应用程序,尽管有时所有这些数据库及其各自的用户都使用一个通用应用程序。为了显示他们是谁,需要加入的数据库的名称存储在公共(本例中为
db1)数据库中,因此系统将知道每行将JOIN的第二个数据库。 -
所以 db1.table_a 包含一列,指示哪个 db table_b 存在。通过这种设计,解决方案将是“复杂的”。也许你可以用一些样本数据来澄清一下。
-
@P.Salmon 更新。
-
创建一个视图。详情见这里:stackoverflow.com/questions/10694601/…