2012-02-10 84 views
1
創建視圖

我在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

你的工會上半年不希望NOT IN子句:從表-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); 

一切加上表-B這些行的表-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