2012-02-10 3 views
1
에서보기를 만들

나는 오라클 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).

내가 달성하고자하는 것은이 세 개의 열로 정보를 사용하여 뷰를 만드는 것입니다. 두 테이블에서 SITE_ID 필드에서 마음에

  • 테이크는 첫 번째 6 자 :

    는 그러나이 견해는이 조건을 충족해야한다.

예를 들어 표 A의 첫 번째 레코드에는이 SITE_ID "BN9032U850"이 있으므로 처음 6자를 부분 문자열로 만들면 결과 SITE_ID는 "BN9032"가됩니다. 그러나 당신이 볼 수 있듯이 표 B의 첫 번째 기록에는 동일한 SITE_ID가 있으므로 중복 기록이 있습니다.

VIEW 출력

:이 경우

, 기록은 표 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

당신의 UNION의 첫 번째 절반 IN 절하지 원하지 않습니다 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에 없기 때문에 두 번째 조건에서 조인을 사용합니다. 가능한 한 고유 한 두 테이블에서 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