2011-09-01 2 views
0

나는 여러 사이트에서 계약을 맺은 고객에게 비용을 청구해야합니다.오라클의 외부 조인 및 자체 참조

사이트의 청구서 수신 주소에는 고객 주소로 청구되는 사이트와 다른 주소로 청구되는 사이트의 두 가지 유형이 있습니다. 사이트 종류는 'status'필드에 의해 처리됩니다. 사이트가 고객 주소로 청구되는 경우 필드는 'C'와 같습니다. 다른 사이트의 주소로 청구되는 경우 'A'이고 'bill_site_id'필드는 결제에 사용 된 'site_id'로 채워집니다. 하나의 쿼리에서 청구서를 보내야하는 주소를 검색하고 싶습니다 ...

고객이 두 개의 사이트를 가지고 있다고 가정 해 봅시다. (A는 결제를 위해 B를 나타냅니다); 요청에 분명히 두 사이트가 표시되지만 결제에만 사용되는 사이트 만 필요합니다 (B). 어떻게 검색하나요? 여기

SELECT CASE wp.status 
     WHEN 'A' 
     THEN wp2.name 
     ELSE c.NAME 
    END AS NAME, 
    CASE wp.status 
     WHEN 'A' 
     THEN wp2.adress 
     ELSE c.street 
    END AS street, 
    CASE wp.status 
     WHEN 'A' 
     THEN wp2.city 
     ELSE c.city 
    END AS city, 
    CASE wp.status 
     WHEN 'A' 
     THEN wp2.postcode 
     ELSE c.postcode 
    END AS postcode 
FROM customer c, site wp, site wp2, customer_site cwp 
WHERE c.idcompany = cwp.idcompany 
    AND cwp.site_id = wp.site_id 
    AND wp2.site_id(+) = wp.bill_site_id 
    AND c.idcompany = :someId 
GROUP BY wp.status, 
    wp2.name, 
    wp2.adress, 
    wp2.city, 
    wp2.postcode 
+0

'(+) = '구문이 너무 오래되었습니다. 오라클에는 'LEFT'와 'RIGHT'조인이 있습니다. –

+0

그래,하지만 이전 스타일 구문이 내 응용 프로그램에서 어디서나 사용되므로 모든 사람들이 이렇게하는 방식을 바꾸고 싶지 않습니다 ... 어쨌든, 나는 이미 간단한 왼쪽 결합을 시도했으며 그 결과는 같습니다. – gobes

+0

어떤 테이블에 "ch"가 앨리어스되어 있습니까? –

답변

0

내가 당신이 원하는 것을 알고 확신하지만 'ch.status이'의를 말합니다 무엇을 100 % 확실하지 않다 (그래서 부드러운 :-)주십시오 익명 처리) 내 쿼리입니다 쿼리. 또한 주어진 정보를 통해 원하는 것을 얻을 수 있는지 확신 할 수 없습니다.

원하는대로 데이터 구조를 제어 할 수 있기를 바랍니다.

사양을 올바르게 읽었 으면 쿼리에 사이트 테이블의 인스턴스가 1 개만 필요하지만 필요하다고 생각하지만 고객의 주소를 식별하는 방법이 명확하지 않습니다.

일방적 인 라운드는 사이트 테이블이 main_address 플래그를 갖는 것입니다.

WHERE c.idcompany = cwp.idcompany 및 cwp.site_id = wp.site_id ... 다음 사이트 테이블에 플래그가있는 경우

(나는 이것이 ch.status 주위 혼란 생각) AND ( (C.STATUS = 'C'AND WP.MAIN_ADDRESS = 1) OR (C.STATUS = 'A'AND WP.SITE_ID = C.BILL_SITE_ID) )

다른 방법이하는 것 고객 테이블의 외래 키로 주소 및 청구 처 주소를 기억하고 상태 플래그를 잊어 버리려면

WP.SITE_ID = DECODE (C.BILLING_ADDRESS, NULL, C.MAIN_ADDRESS, C.BILLING_ADDRESS)

이이 아마도 당신이이 포함 된 테이블의 DESCRIBE 게시 할 말이 없으면

(210).

+0

이것은 도움이 될 수 있지만 플래그는 '사이트'테이블에만 있으며 테이블 구조를 변경할 수 없습니다 ... 익명의 테이블 설명을 게시하려고합니다. – gobes

0

기술적으로 Union은 두 개의 쿼리이지만 하나의 명령으로 실행할 수 있으며 원하는대로 수행해야 옵션으로 버릴 수 있습니다. :)

SELECT c.Name AS NAME, c.street AS STREET, c.city AS CITY, c.postcode AS postcode 
FROM customer c 
INNER JOIN customer_site cwp ON c.idcompany = cwp.idcompany 
INNER JOIN site wp ON cwp.site_id = wp.site_id 
WHERE c.idcompany = :someid AND wp.status = 'C' 
UNION 
SELECT wp2.name AS NAME, wp2.adress AS STREET, wp2.city AS CITY, wp2.postcode AS postcode 
FROM customer c 
INNER JOIN customer_site cwp ON c.idcompany = cwp.idcompany 
INNER JOIN site wp ON cwp.site_id = wp.site_id 
INNER JOIN site wp2 ON wp.bill_site_id = wp2.site_id 
WHERE c.idcompany = :someid AND wp.status = 'A' 

테이블 구조를 볼 수 없으므로 더 많이 최적화 할 수는 있지만 작업 방향을 알려줄 것입니다. 이것은 기존 질의보다 더 빠를 수는 없지만 이해하기가 쉽습니다.