如何在单个查询中从多个数据库中检索数据?

时间:2014-06-11 11:31:33

标签: java sql-server database jdbc connectivity

如果我有多个具有相同表和列的数据库,我如何使用Java中的单个查询从这些数据库中检索数据。 为单个数据库做了这个,我是java的新手,请建议。

public class MultipleDBTest{
   public void dbConnect(String db_connect_string, String db_userid, String db_password){
     try{
       Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
       Connection conn = DriverManager.getConnection(db_connect_string, db_userid, db_password);
       System.out.println("connected");
       Statement statement = conn.createStatement();
       String queryString = "select <Col1>, <Col2> from <Table>";
       ResultSet rs = statement.executeQuery(queryString);
        while(rs.next()){
          System.out.println(rs.getString(1) + " | " + rs.getString(2));
        }
      }
      catch(Exception e){
        e.printStackTrace();
      }
  }

  public static void main(String[] args){
    ConnectMSSQLServer connServer = new ConnectMSSQLServer();
    connServer.dbConnect("jdbc:sqlserver://localhost;databaseName=<Database1>","<Username>","<Password>");
  }
}

5 个答案:

答案 0 :(得分:2)

从多个服务器获取数据的最简单方法是链接它们,使用完全限定的表名称查询每个表中的数据,即Server.Database.Schema.Table,并使所有服务器都联合起来。

如果您将其他服务器链接到您正在进行查询的服务器,则

Yo只能在完全限定名称Server中指定所需的服务器。

你最终会得到类似的东西

select * from Server1.Database1.dbo.Table
  union
select * from Server2.Database2.dbo.Table
  union
select * from Server3.Database2.dbo.Table

请参阅此文章,了解链接服务器的内容以及设置方式:Linked Servers (Database Engine)

答案 1 :(得分:0)

让Sql Server为您完成工作。在其中一个数据库中创建一个视图,该数据库引用其他数据库中表的数据。这样,您的代码只需要访问一个数据库中的一个对象即视图。

如果数据库位于同一服务器上,这是最简单的。如果数据库位于不同的服务器上,则需要将它们链接起来。

答案 2 :(得分:0)

如果通过&#34;多个数据库&#34; - 您指的是同一数据库中的多个模式,然后您可以使用模式名称并进行JOIN。另外,请确保您具有足够的权限来读取这两个模式。 SQL查询的格式为:

select S1T1.Col1, S1T1.Col2, S2T1.Col1, S2T1.Col2 
from Schema1.T1 S1T1, Schema2.T1 S2T1
where S1T1.Col1=S2T1.Col1

如果您指的是不同数据库实例上的多个数据库,那么您可能必须在数据库实例之间创建链接。有关更多信息,请参阅此SO帖子: Querying data by joining two tables in two database on different servers

如果信息有所帮助,请不要忘记投票。谢谢! :)

答案 3 :(得分:0)

引用表时的Database.Schema.Table

引用列

时的Database.Schema.Table.Column

您可以通过这种方式在数据库之间编写联接,并从多个数据库中精确地提取数据。

USE [DatabaseA]



SELECT * FROM DatabaseA.dbo.DSNA_tblMaiin

INNER JOIN DatabaseB.dbo.DSNB_tblMaiin ON DatabaseA.dbo.DSNA_tblMaiin.Serialnumber = DatabaseB.dbo.DSNB_tblMaiin.Serialnumber

INNER JOIN DatabaseB.dbo.DSNC_tblMaiin ON DatabaseA.dbo.DSNA_tblMaiin.Serialnumber = DatabaseC.dbo.DSNC_tblMaiin.Serialnumber

答案 4 :(得分:-1)

您正在寻找的是联邦层。该层将解析SQL,将创建每个数据库的查询。这些独立查询将在数据库上触发,结果将基于where子句连接。网上有一些基于Antlr的SQL语法,因此您可以使用它们来解析SQL并生成特定于数据库的SQL。