【问题标题】:How to select unique data from two databases如何从两个数据库中选择唯一数据
【发布时间】:2014-12-24 13:45:32
【问题描述】:

我有两个数据库;数据库 A 和数据库 B。数据库 A 在我的计算机中,而数据库 B 托管在在线服务器中。这两个数据库包含具有相同数据类型的相同表,但数据库 A 将包含比数据库 B 更多的数据。我想从数据库 A 中选择所有唯一数据。

数据库 A 表 A

Id  | FName      | LName
-----------------------------
1   | Jhone      | A
2   | Alice      | B
3   | Bob        | C 

数据库 B 表 A

Id  | FName      | LName
-----------------------------
1   | Jhone      | A

我要选择:

2   | Alice      | B
3   | Bob        | C 

我该怎么做?

【问题讨论】:

  • 您可以通过将所有数据从本地数据库发送到远程数据库并让其决定来做到这一点。但是,这是非常低效的,您有什么限制?这种操作会经常发生吗?
  • 如果您的服务器类型允许,您可以链接两个服务器。例如:msdn.microsoft.com/en-us/library/ff772782.aspx 然后通过一个查询可以链接两个表。

标签: java database


【解决方案1】:

选项 1

好吧,那么无聊(也很难)的方法是向不同的数据库发出单独的 SQL 查询,然后编写一堆 java 来比较结果。这完全可以做到,但是哎呀。

如果您需要定期执行此类操作,则应使用联合数据库或虚拟数据库工具。基本上,这些工具所做的是创建一个虚拟的“超级数据库”,其中包含您需要在其中查询的两个数据库。因此,您可以连接到虚拟数据库并发出针对两个数据库的 SQL 查询。

一个简单的例子是UnityJDBC。如果你四处搜索,还有其他的,比如VJDBC

然后,您只需针对两个 DB 编写一个 SQL 查询,即可满足您的需求,即going to be a left join from Database A Table A to Database B table A

在 UnityJDBC 中,可能是这样的:

SELECT ID, FName, Lname
FROM Database_A.TableA, Database_B.TableB
LEFT JOIN Database_B.TableB ON Database_A.TableA.ID = Database_B.TableB.ID;

这个查询并没有那么复杂,但它之所以成为可能,是因为您使用了虚拟 DB 层。

选项 2

使用提取、转换和加载工具(如Pentaho Kettle)将数据从一个提取到另一个。您可以使用 GUI 应用程序来执行此操作,也可以使用他们的开源 Java 库并将其构建到您的应用程序中。

【讨论】:

  • 我在使用带有链接表的 MS Access 之前已经这样做了,这是在给定链接中突出显示的一种方法,可以替代使用他们的产品。因此,如果您在 Windows 上运行并拥有 MS Access .....
  • 实际上我想要做的是在用户单击按钮的一天结束时使用数据库 A 中的数据更新数据库 B。除了这个之外,他们还有其他简单的方法吗?
  • 查看更新的答案。我不知道您所说的“简单方法”是什么意思。您可以像我在选项 1 的第一段中所说的那样编写一堆 java 代码,但我认为从长远来看这不会更简单。我试图提出一些重用现有优秀软件的建议,而不是建议您编写更多自己的软件。学习其他软件需要时间,但它的痛苦要小得多,而且不太可能出现错误。
  • 如果想法是保持数据库 A 和数据库 B 的数据相同,您对联合表有何看法?但它可能很慢..
  • 联合表可能很慢,但这是因为您正在通过网络传输数据并将其与其他数据进行比较。值得指出的是,为了解决这个问题,OP 必须 这样做。唯一的问题是 OP 是否会自己重新实现它,或者重用代码来做同样的事情。发出两个单独的查询然后在客户端的 java 代码中进行连接真的更好吗?
【解决方案2】:

如果你只需要这样做一次,并且数据不是太大

  • 将两个表都导出为 CSV
  • 把它们放在同一个盒子里
  • 使用 grep 查找 A 中不在 B 中的列

    grep -vf DB_B_Table_A.csv DB_A_Table_A.csv

【讨论】:

  • OP 正在尝试将其连接到应用程序中的按钮;这个答案需要大量的手工工作,并且假设是 UNIX。在 Java 应用程序中吞下这个功能可能会很麻烦。
  • 对,对,但是 OP 标记了这个 java 和数据库。几乎有无数种方法可以做到这一点,包括使用 Ruby 或任何其他技术。问题和标签的提出几乎假定 java 和数据库,而不是 shell,或 MS Access,或 CSV,或 Ruby,或(这里有 1000 个其他选项)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-03
相关资源
最近更新 更多