Oracle создает представление из двух таблиц - PullRequest
1 голос
/ 10 февраля 2012

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

Таблица 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 из обеих таблиц.

Например, первая запись из таблицы A имеет этот SITE_ID "BN9032U850", поэтому, если мы подставим первые 6 символов, результирующий SITE_ID будет "BN9032". Но, как вы можете видеть, первая запись из таблицы B имеет тот же SITE_ID, поэтому будет повторяющаяся запись.

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

ПОСМОТРЕТЬ ВЫХОД

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 ]

2 голосов
/ 10 февраля 2012

Первая половина вашего UNION не нуждается в предложении NOT IN:

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 голосов
/ 10 февраля 2012

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

Это функционально аналогично ответу Джонатана Леффлера , но оно более четко показывает тот факт, что если вы выбираете все из этого представления, то вы будете выполнять полное сканирование и полное сканирование индекса 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...