我在Oracle数据库中有2个表。 我想以最佳方式比较这些表格。 下面是我想要完成的一个例子。
表1
ID FieldA FieldB
1 X Y
2 C D
3 E F
4 G H
5 I J
表2
ID FieldA FieldB
10 Z V
8 K L
1 O P
2 S T
必须根据ID比较这两个表。 如果Table2中不存在ID,我想在Table2中插入该信息。 如果表2中存在ID,我想通过覆盖Table1中的信息来更新Table2中的信息。 此外,我需要识别Table2中存在的ID,但是从Table1中删除,并在表2中标记一列,以便它表示缺少条目。
两个表的结构相同(列数,列名,索引)。
我的想法是做以下事情:
最终结果应该是这样的:
表2
ID FieldA FieldB
10 Z V ---> This row will be marked with a flag to indicate its an invalid entry
8 K L ---> This row will be marked with a flag to indicate its an invalid entry
1 X Y
2 C D
3 E F
4 G H
5 I J
两个表中都有数百万条记录。 有人能建议为大量数据实现这一结果的最佳方法吗? (任何示例代码片段都会有帮助。)我不确定多线程是否有用,因为我对线程知之甚少。
注意:每次插入/修改一个条目后,我都想调用一些API来记录一些消息。
答案 0 :(得分:2)
不要考虑为此编写任何java。这样的事情应该在DB中完成。学习一些SQL。
如果Table2中不存在ID,我想在Table2中插入该信息。
我不知道确切的Oracle语法,但它遵循这一行
INSERT INTO Table2 (SELECT * FROM Table1 LEFT JOIN Table2 ON Id WHERE Table2.Id IS NULL)
全部,没有数据从数据库发送到应用程序。工作原理:
SELECT * FROM Table1 JOIN Table2 ON Id
会将Table1中的每一行与Table2中具有相同Id的行配对。
SELECT * FROM Table1 LEFT JOIN Table2 ON Id
另外返回Table1中没有表2中相应行的所有行。对于他们,Table2.Id为NULL。
SELECT * FROM Table1 LEFT JOIN Table2 ON Id WHERE Table2.Id IS NULL
过滤掉具有非空Table2.Id的行,即匹配的行。
插入插入......全部。数据库针对此类任务进行了优化,因此一百万行是花生。
答案 1 :(得分:0)
如果表1中存在具有此ID的记录,则使用表1中的条目覆盖表2中的条目。此外,在某些数据结构中维护此ID信息。
我会使用MERGE
语句。它会处理INSERT
和UPDATE
逻辑。您有两个表,需要检查table_1中的ID,因此USING
子句将SELECT column_list... FROM TABLE_1
逻辑是:
WHEN MATCHED THEN INSERT....
和
WHEN NOT MATCHED
THEN
UPDATE TABLE_2...
所以,你所做的只是MERGE INTO TABLE_2
在此处阅读有关MERGE的文档http://docs.oracle.com/database/121/SQLRF/statements_9016.htm
您可以在http://www.oracle-base.com/articles/10g/merge-enhancements-10g.php
找到有关MERGE语句的更多示例