如何从具有相同表和字段名称的不同数据库中选择字段?

3

我有两个数据库,为了方便起见,我们称它们为db1和db2。它们的结构完全相同,并且都有一个名为table1的表,其中都有id和value1字段。

我的问题是如何查询选择连接到相同id的两个表的value1字段?

5个回答

3

您可以在表名前加上数据库名称来标识两个同名的表。然后,您可以使用完全限定的表名来引用同名字段。

因此,不使用别名:

select db1.table1.id, db1.table1.value1, db2.table1.value1
from db1.table1 inner join db2.table1 on db1.table1.id = db2.table1.id

并且使用别名

select t1.id, t1.value1, t2.value1
from db1.table1 as t1 inner join db2.table1 as t2 on t1.id = t2.id

您可能还希望给所选列取别名,这样您的选择行就变成了:
select t1.id as id, t1.value1 as value_from_db1, t2.value1 as value_from_db2

1

这是T-Sql,但我想象不出mysql会有太大的区别(如果不是这种情况,我会删除答案)

SELECT
  a.Value1 AS [aValue]
  ,b.Value1 AS [bValue]
FROM
  db1.dbo.Table1 a
  INNER JOIN db2.dbo.Table1 b
    ON a.Id = b.Id

0

在SQL中有一种简单的方法。扩展您的FROM子句语法,因此不要使用select ... from tablename,而是使用

select ... from database.namespace.tablename

默认命名空间为dbo。


是的,但出现的问题是字段名称相同:S - Richard
1
您可以在字段名称前加上适当的数据库.命名空间.表名前缀,以区分两个相同的字段名称。或者,您可以使用别名来区分表名。 - Shadwell
@Shadwell,你能否给个例子吗?我承认在 SQL 方面我还是有点新手。 - Richard
我已经添加了一个带有示例的答案。评论区太小了,放不下。 - Shadwell
是的,就像Shadwell所说的那样。在这里,你会发现'as'关键字非常有用。 - DanDan

0

您可以使用联合查询:

简单示例:

select "one" union select "two";

这将返回2行,第一行包含one,第二行包含two。它就像您连接2个SQL查询一样,唯一的常量是它们都必须返回相同数量的列。

多个数据库:

select * from client_db.users where id=1 union select * from master_db.users where id=1;

在这种情况下,用户数据库中的列数必须相同。您说它们具有相同的结构,所以不应该有问题。


0

尝试类似这样的东西。

$dbhost="server_name";
$dbuser1="user1";

$dbpass1="password1";

$dbname1="database_I";
$dbname2="database_II";
$db1=mssql_connect($dbhost,$dbuser1,$dbpass1);

mssql_select_db($dbname1,$db1);

$query="SELECT ... FROM database_I.table1, database_II.table2 WHERE ....";

等等。 如果这不能帮助你,很抱歉。


“哈哈,是的,它并没有很大帮助。我知道我可以通过一些脚本得到我想要的结果,但我希望有一种简单的方式只用 SQL 命令就能达成我的愿望。” - Richard

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接