2012-02-10 10 views
1
からビューを作成し

私は、Oracle 11gの次のテーブルがあります:あなたは両方のテーブルに見ることができるようにOracleの二つのテーブル

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)書いたものだけに興味があります。

私が達成したいのは、これらの3つの列を持つビューを両方のテーブルの情報と共に作成することです。

しかし、このビューは、この条件を満たさなければならない:

  • は念頭に置いて、両方のテーブルからのSITE_IDフィールドから最初の6つの文字を取ります。例えば

、表Aからの最初のレコードは、このSITE_ID「BN9032U850」を有しているので、我々は最初の6つの文字サブストリング場合、得SITE_IDは「BN9032」であろう。しかし、あなたが見ることができるように、表Bの最初のレコードは同じSITE_IDを持っているので、重複レコードが存在します。

この問題が発生した場合は、ビューに追加するレコードは表Aから1、ではない私は、この出力を達成したい最終的には表Bからのいずれかである必要があります

VIEW出力

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の前半は句にないたくない:Table_Aから

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_Bにおけるそれらの行はTable_Aには見られません。

0

table_Aのすべてがtable_Bにない場合は、2番目の条件で結合を使用します。可能であれば、両方のテーブルの機能インデックスを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