2017-09-07 27 views
1

我有2个表:customerphone获取电话号码或空(其中有最大编辑的日期)为每一个客户

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

你可以尝试:

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

总结中PHONE表第一数据;使用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 
;