2013-12-23 3 views
3

У меня есть две разные таблицы, скажем, таблица A и B в оракуле с примерно 15 миллионами записей в каждом. Table A имеет столбцы (a,b,c,d) и Table B имеет столбцы (e,f,g,h).Найти различия между двумя большими таблицами в оракуле

Цель состоит в том, чтобы записать хранимую процедуру, чтобы проверить, присутствует ли каждая таблица в таблице А в таблице B и наоборот. Различия между этими двумя должны быть вставлены в третью таблицу.

Моя проблема заключается в том, что column a в Table A следует сравнить с СЦЕПИТЬ колонного е и е в таблице B, если column e содержит определенную строку (0311), если не я должен сравнить его только с column f.

Column b следует сравнить с column g в table B и я также сравнить column c в table A с column g в table B, если два не матч 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 
+0

В общем, вы можете найти строки, которые находятся в 'tableA', но не в' tableB' (при условии, те же/подобные структуры) с этим запросом: 'SELECT * FROM tableA MINUS SELECT * FROM tableB'. Для вашего вопроса, хотя нам понадобится еще более подробная информация, можете ли вы разместить пример из 3-4 строк «TableA» и 3-4 строк «TableB», включая, по крайней мере, одну строку, которая заставила бы сравнить конкатенированное значение? –

+0

да, например, эти два соответствуют: Таблица A: 9353456789,03117884657,12082200003035,12082123595535 Таблица B: 9353456789,0311,7884657,12082200003035 – Narges

+1

Извините, этого недостаточно. Не могли бы вы включить по крайней мере один набор строк для каждого сценария (concatenate versus not concatenate), и вы также можете определить столбцы 'a',' b', 'c', ...' g'. Также, пожалуйста, укажите, что должна содержать «определенная строка», в которой должен находиться столбец 'e'. Было бы лучше, если бы вы отредактировали свой вопрос и добавили примеры, а не размещали их в комментарии. Я уверен, что на ваш вопрос можно ответить, как только он будет определен достаточно хорошо. –

ответ

1

SQL Fiddle

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 

Results:

|   I |   J |    K |    L | 
|------------|-------------|----------------|----------------| 
| 9353456789 | 03617884657 | 12082200003034 | 12082123595534 | 
| 9353456789 |  0361 | 03617884657 | 12082200003036 | 
0

Я бы сделал это как два утверждения, хотя его можно комбинировать

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 

Левых присоединиться возвратим аннулирует где строка не найдена в таблице б, так что это должно вызвать список строк i9n столе не в таблице б. Измените инструкцию на правое соединение и выберите b. *, И вы увидите, что находится в b, но не в a.

Заявление может быть преобразовано в «create table as», которое создаст новую таблицу с результатами этого оператора select.

Я положил и ... ваши условия немного запутанны, вам просто нужно использовать операторы case, чтобы выбрать столбцы, которые вы хотите сравнить/присоединиться.

+0

и как импортировать результат в другую таблицу? извините, но я действительно новый в sql. – Narges

+0

Это просто в оракуле ... добавив CREATE TABLE new_table AS **, поставьте здесь свой выбор **. Это сохранит результаты вашего запроса как new_table (вы можете изменить использование любого имени для таблицы вместо new_table) – Twelfth

+0

Я сделал быстрое редактирование ... concatonate в Oracle делается как field1 || field2 (или field1 || '' || field2, если вы хотите пробел между ними) – Twelfth

Смежные вопросы