2017-09-07 4 views
1

테이블이 두 개 있습니다 : customerphone입니다.각 고객 당 전화 번호 또는 Null (최대 편집 날짜가 있음)을 받으십시오.

phone에는 전화 번호가 customer 개까지 포함될 수 있습니다.

최대 편집 날짜가있는 전화를 받으려고했습니다.

SELECT customer.customer_name, phone.phone_number 
FROM customer 
LEFT JOIN phone ON phone.customer_id = customer.customer_id 
AND phone.edit_date = 
    (SELECT MAX(edit_date) 
    FROM phone ph 
    WHERE ph.customer_id = customer.customer_id 
    GROUP BY ph.customer_id 
) 

나는 오류를

ORA-01799를 가지고 : 열이 외부에 가입 된 하위 쿼리하지 않을 수 있습니다.

고객이 10 명이고 전화가 40 개인 경우 10 개의 행을 가져야합니다. 다른 방법이 있습니까?

답변

0

사용 윈도우 함수 :

SELECT c.customer_name, p.phone_number 
FROM customer c LEFT JOIN 
    (SELECT p.*, 
      ROW_NUMBER() OVER (PARTITION BY customer_id ORDER BY edit_date DESC) as seqnum 
     FROM phone p 
    ) p 
    ON p.customer_id = c.customer_id and p.seqnum = 1; 
0

당신이 시도 할 수 : 먼저 PHONE 테이블에

with phone_max_edit as 
    (SELECT customer_id, phone_number 
    FROM phone ph 
    WHERE ph.edit_date = 
     (SELECT MAX(ph2.edit_date) 
     FROM phone ph2 
     WHERE ph2.customer_id = ph.customer_id 
) 
SELECT customer.customer_name, phone_max_edit.phone_number 
FROM customer 
    LEFT JOIN phone_max_edit 
      ON phone_max_edit.customer_id = customer.customer_id 
0

집계 데이터를; LAST 집계 함수를 사용하십시오 (많은 실무자가 무시하는 매우 유용한 함수입니다. 고급 스레드 인 경우에도이 스레드와 다른 스레드에 게시 된 답변에서 보여지는 것처럼). https://docs.oracle.com/cd/E11882_01/server.112/e41084/functions083.htm#SQLRF00653

코드에 이미있는대로 LEFT JOIN을 추가하십시오.

SELECT customer.customer_name, ph.phone_number 
FROM customer 
LEFT JOIN 
(select customer_id, 
      max(phone_number) keep (dense_rank last order by edit_date) as phone_number 
    from  phone 
    group by customer_id 
) ph 
ON ph.customer_id = customer.customer_id 
;