首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在oracle中查找两个大型表之间的差异

问在oracle中查找两个大型表之间的差异
EN

Stack Overflow用户
提问于 2013-12-23 20:36:19
回答 2查看 2.4K关注 0票数 3

我有两个不同的表,比如说甲骨文表A和表B,每个表约有1500万张。Table A有(a,b,c,d)列,Table B有(e,f,g,h)列。

目的是编写一个存储过程,以检查表A中的每条记录是否也存在于表B中,反之亦然。这两者之间的差异应插入到第三个表中。

我的问题是,如果column a包含某个字符串(0311),则应该将Table A中的column e与表B中E和f列的级联进行比较,如果没有,则必须将其与column f进行比较。

Column b应该在table B中与column g进行比较,我还必须将table A中的column c与table B中的column g进行比较,如果两者不是匹配的,则column d应该与column g进行比较。

最快的方法是什么?

,例如,这两个是匹配的:

代码语言:javascript
复制
Table A: 9353456789,03117884657,12082200003035,12082123595535
Table B: 9353456789,0311,7884657,12082200003035

或者:

代码语言:javascript
复制
Table A: 9353456789,03117884657,12082200003035,12082123595535
Table B: 9353456789,0311,7884657,12082123595535

不需要级联且匹配的记录示例:

代码语言:javascript
复制
Table A: 9353456789,03617884657,12082200003035,12082123595535
Table B: 9353456789,0361,03617884657,12082200003035
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-12-23 21:10:23

SQL Fiddle

Oracle 11g R2架构设置

代码语言:javascript
复制
CREATE TABLE TableA ( a VARCHAR2(20), b VARCHAR2(20), c VARCHAR2(20), d VARCHAR2(20) );
CREATE TABLE TableB ( e VARCHAR2(20), f VARCHAR2(20), g VARCHAR2(20), h VARCHAR2(20) );
CREATE TABLE TableC ( i VARCHAR2(20), j VARCHAR2(20), k VARCHAR2(20), l VARCHAR2(20) );

INSERT INTO TableA
          SELECT '9353456789','03117884657','12082200003035','12082123595535' FROM DUAL
UNION ALL SELECT '9353456789','03617884657','12082200003035','12082123595535' FROM DUAL
UNION ALL SELECT '9353456789','03617884657','12082200003034','12082123595534' FROM DUAL;

INSERT INTO TableB
          SELECT '9353456789','0311','7884657','12082200003035' FROM DUAL
UNION ALL SELECT '9353456789','0311','7884657','12082123595535' FROM DUAL
UNION ALL SELECT '9353456789','0361','03617884657','12082200003035' FROM DUAL
UNION ALL SELECT '9353456789','0361','03617884657','12082200003036' FROM DUAL;

查询1

要插入行-使用两个表之间的一个INSERT INTO... SELECT执行一个FULL OUTER JOIN,使用您的需求作为连接条件;然后对于不匹配的行,TableA(a, b, c, d)将全部为NULL或TableB(e, f, g, h)将全部为NULL,这可以在WHERE条件中使用,只得到不匹配的行。最后,为了不返回NULL值,COALESCE()用于返回的值。

代码语言:javascript
复制
INSERT INTO TableC
    SELECT COALESCE( ta.a, tb.e ) AS i,
           COALESCE( ta.b, tb.f ) AS j,
           COALESCE( ta.c, tb.g ) AS k,
           COALESCE( ta.d, tb.h ) AS l
    FROM TableA ta
         FULL OUTER JOIN
         TableB tb
         ON (    ta.a = tb.e
             AND ta.b = CASE tb.f WHEN '0311' THEN tb.f || tb.g ELSE tb.g END
             AND ( ta.c = tb.h OR ta.d = tb.h )
            )
    WHERE ta.a IS NULL
    OR    tb.e IS NULL;

查询2

代码语言:javascript
复制
SELECT * FROM TableC

结果

代码语言:javascript
复制
|          I |           J |              K |              L |
|------------|-------------|----------------|----------------|
| 9353456789 | 03617884657 | 12082200003034 | 12082123595534 |
| 9353456789 |        0361 |    03617884657 | 12082200003036 |
票数 1
EN

Stack Overflow用户

发布于 2013-12-23 20:59:27

我会把它作为两条语句来做,尽管它可以被合并

代码语言:javascript
复制
Select a.* 
from tablea a left join tableb b on a.a = 
 case when e = 'string' then b.e || b.f else b.f end 
and ...
where b.e is null

在表b中找不到行的情况下,左联接将返回空值,因此这将显示表b中的行i9n表a的列表。将语句更改为右联接并选择b。*,您将看到b中的行,而不是a中的行。

语句可以转换为“create”,该表将创建一个新表,其中包含此select语句的结果。

我把..。您的条件有点混乱,您只需要使用case语句来选择要比较/连接的列。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20750812

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档