2014-09-08 2 views
0

고객 및 공급 업체를위한 프로젝트 목록을 반환하는보기가 있습니다.합집합을 사용하여 분기 SQL 쿼리

CREATE OR REPLACE VIEW projects_list AS 
SELECT pr.*, 
     c.customer_name as party_name, 
     null as vendor_id, 
     null as vendor_data 
    FROM projects pr 
    JOIN customers c on (pr.customer_id = c.customer_id) 
UNION ALL 
SELECT pr.*, 
     v.vendor_name as party_name, 
     v.vendor_id, 
     v.some_column as vendor_data 
    FROM projects pr 
    JOIN projects_of_vendors pov on (pr.project_id = pov.project_id) 
    JOIN vendors v on (pov.vendor_id = v.vendor_id) 

기본적으로 나는이보기를 사용하여 고객 또는 공급 업체를위한 프로젝트 목록을 가져오고 둘 다 동시에 가져올 수 없습니다. 그래서,보기 중 하나로 쿼리 :

또는

SELECT * FROM projects_list 
WHERE vendor_id = 'A_VENDOR'; 

그래서 basicly 내가 더 VENDOR_ID 세트 또는 두 번째 부분이없는 경우 노동 조합의 첫 번째 부분 중 하나를 실행하고자하는 - 경우 vendor_id가 설정되었습니다.

문제점은 고객으로보기에 액세스 할 때 오라클이 불필요 할 때 오라클이 "공급 업체 branck"을 확인하는 데 오랜 시간을 소비하고 쿼리가 느려지 게된다는 것입니다.

이제이보기를 2 개로 분할하고 매번 다른보기를 선택할 수 있습니다. 그러나 실제로 나는 이것에 의존하는 많은 견해를 가지고 있으며 나는이 것을 직접적으로 접근하지 않는다. "자식"뷰 각각을 복제하고이 변경을 위해 애플리케이션 코드를 많이 변경해야합니다.

노어가 노조의 첫 번째 또는 두 번째 지점을 건너 뛰는 것을 "암시 할 수있는 방법이 있습니까?

+0

당신은 당신의 선택 열 이름을 명시 적으로 고려하실 수 있습니다 사용합니다. 작업을 마쳤 으면 각 유니언에 'V'및 'C'와 같은 추가 상수 열을 추가 한 다음 명시 적으로 선택하십시오. - 도움이 되나요? –

+0

감사합니다. – SWilk

+0

답장으로 붙여 드리겠습니다. –

답변

0

명시 적으로 선택한 열의 이름을 지정하는 것이 좋습니다. 작업을 마쳤 으면 각 유니언에 'V'및 'C'와 같은 추가 상수 열을 추가 한 다음 명시 적으로 선택하십시오. - 도움이 되나요? 즉

CREATE OR REPLACE VIEW projects_list AS 
SELECT pr.*, 'C' Type 
     c.customer_name as party_name, 
     null as vendor_id, 
     null as vendor_data 
    FROM projects pr 
    JOIN customers c on (pr.customer_id = c.customer_id) 
UNION ALL 
SELECT pr.*, 'V' 
     v.vendor_name as party_name, 
     v.vendor_id, 
     v.some_column as vendor_data 
    FROM projects pr 
    JOIN projects_of_vendors pov on (pr.project_id = pov.project_id) 
    JOIN vendors v on (pov.vendor_id = v.vendor_id) 

그런 다음

SELECT * FROM projects_list WHERE Type = 'V'...