2012-02-10 5 views
1

У меня есть следующие таблицы в Oracle 11g:Oracle создать вид из двух таблиц

Таблица A

SITE_ID  SITE_NAME  VECTOR  .........MANY OTHER FIELDS 

BN9032U850 REY DEL MAR  ENSENADA 
BS2362U850 COSTA BAJA  LA PAZ 
BS2601U850 LA PAZ   LA PAZ 
BS2606U850 CONQUISTADORES LA PAZ 
BN2679U850 COAST CAST  TIJUANA 
BN7116U850 PALACIO AZTECA TIJUANA 

Таблица B

SITE_ID  SITE_NAME    VECTOR  .........MANY OTHER FIELDS 

BN9032  REY DEL MAR   (null) 
BN9033  BRISAS DEL MAR  (null) 
BS2601  CUMBRES DE LA PRESA (null) 
BN9038G850 REAL DEL CASTILLO  (null) 
BS0014G850 SAN BRUNO    (null) 

Как вы можете видеть в обеих таблицах есть много другие поля, но им интересны только те, которые я написал (SITE_ID, SITE_NAME, VECTOR).

Что я хочу достичь, так это создать представление с этими тремя столбцами, но с информацией из обеих таблиц.

Но этот вид должен соответствовать этому условию:

  • Примите во внимание только первые 6 символов из поля SITE_ID из обеих таблиц.

Например, первая запись из таблицы А имеет этот Site_ID «BN9032U850», так что если мы подстрока первые 6 символов, в результате SITE_ID будет «BN9032». Но, как вы видите, первая запись из таблицы B имеет тот же SITE_ID, поэтому будет дубликат записи.

Если это произойдет, то запись будет добавлена ​​к представлению должна быть одна из таблицы А, а не один из таблицы B. В конце концов, я хочу, чтобы достичь этого результата:

VIEW OUTPUT

SITE_ID SITE_NAME   VECTOR 

BN9032 REY DEL MAR   ENSENADA --->Table A 
BS2362 COSTA BAJA   LA PAZ  --->Table A 
BS2601 LA PAZ    LA PAZ  --->Table A 
BS2606 CONQUISTADORES  LA PAZ  --->Table A 
BN2679 COAST CAST   TIJUANA  --->Table A 
BN7116 PALACIO AZTECA  TIJUANA  --->Table A 
BN9033 BRISAS DEL MAR  (null)  --->Table B 
BN9038 REAL DEL CASTILLO (null)  --->Table B 
BS0014 SAN BRUNO   (null)  --->Table B 

Я работаю над этим предложением, но что-то кажется неправильным.

SELECT SUBSTR(SITE_ID,1,6) SITE_ID,SITE_NAME, VECTOR FROM TABLE_A 
WHERE(SUBSTR(SITE_ID,1,6)) NOT IN 
(SELECT SUBSTR(SITE_ID,1,6) FROM TABLE_B) 
UNION 
SELECT SUBSTR(SITE_ID,1,6) SITE_ID,SITE_NAME, VECTOR FROM TABLE_B 
WHERE(SUBSTR(SITE_ID,1,6)) NOT IN 
(SELECT SUBSTR(SITE_ID,1,6) FROM TABLE_A); 

Надеюсь, вы можете мне помочь с кодом примера, чтобы начать.

ответ

2

Первая половина вашего UNION не хочет НЕ В статье:

SELECT SUBSTR(SITE_ID,1,6) SITE_ID,SITE_NAME, VECTOR 
    FROM TABLE_A 
UNION 
SELECT SUBSTR(SITE_ID,1,6) SITE_ID,SITE_NAME, VECTOR 
    FROM TABLE_B 
WHERE(SUBSTR(SITE_ID,1,6)) NOT IN (SELECT SUBSTR(SITE_ID,1,6) FROM TABLE_A); 

Все от TABLE_A плюс те строки в TABLE_B не нашли в TABLE_A.

0

Как вы хотите все в table_A, что нет в table_B Я бы использовал соединение во втором условии. У вас должен быть функциональный индекс на substr(site_id,1,6) на обеих таблицах, если возможно, уникальный, чтобы ускорить это.

Это функционально похоже на Jonathan Leffler's answer, но в нем более четко указано, что если вы выберете все из этого представления, вы получите полное сканирование и полное сканирование индекса table_A - при условии, что предложенный указатель на месте. Это также делает более явным, что если вы входите в индекс, вы будете делать только индексный диапазон/уникальное сканирование в обеих таблицах.

select substr(site_id,1,6), as site_id ,site_name, vector 
    from table_a 
union 
select substr(site_id,1,6), as site_id ,site_name, vector 
    from table_b b 
    left outer join table_a a 
    on substr(b.site_id,1,6) = substr(a.site_id,1,6) 
where a.site_id is null 
Смежные вопросы