我有两个不同的表,比如说甲骨文表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进行比较。
最快的方法是什么?
,例如,这两个是匹配的:
Table A: 9353456789,03117884657,12082200003035,12082123595535
Table B: 9353456789,0311,7884657,12082200003035或者:
Table A: 9353456789,03117884657,12082200003035,12082123595535
Table B: 9353456789,0311,7884657,12082123595535不需要级联且匹配的记录示例:
Table A: 9353456789,03617884657,12082200003035,12082123595535
Table B: 9353456789,0361,03617884657,12082200003035发布于 2013-12-23 21:10:23
Oracle 11g R2架构设置
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()用于返回的值。
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
SELECT * FROM TableC| I | J | K | L |
|------------|-------------|----------------|----------------|
| 9353456789 | 03617884657 | 12082200003034 | 12082123595534 |
| 9353456789 | 0361 | 03617884657 | 12082200003036 |发布于 2013-12-23 20:59:27
我会把它作为两条语句来做,尽管它可以被合并
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语句来选择要比较/连接的列。
https://stackoverflow.com/questions/20750812
复制相似问题