这将返回所有客户,无论他们是否有任何订单:
SQL> select c.name
2 , c.email_address
3 , ( select max (o.order_date) from orders o
4 where o.customer_no = c.customer_no )as last_order
5 from customers c
6 /
NAME EMAIL_ADDRESS LAST_ORDE
-------------------- ------------------------- ---------
ACME Industries info@acme.com 07-APR-10
Tyrell Corporation accounts@tyrellcorp.com 26-MAR-10
Lorax Textiles Co the.lorax@hotmail.com
SQL>
相当于LEFT OUTER JOIN:
SQL> select c.name
2 , c.email_address
3 , o.last_order_date
4 from customers c
5 left join ( select o.customer_no
6 , max (o.order_date) as last_order_date
7 from orders o
8 group by o.customer_no ) o
9 on o.customer_no = c.customer_no
10 /
NAME EMAIL_ADDRESS LAST_ORDE
-------------------- ------------------------- ---------
ACME Industries info@acme.com 07-APR-10
Tyrell Corporation accounts@tyrellcorp.com 26-MAR-10
Lorax Textiles Co the.lorax@hotmail.com
SQL>
RIGHT OUTER JOIN 只会返回带有订单的客户的行。假设一个订单必须有一个客户(即强制外键),那么这与 INNER JOIN 相同。
如果您的数据库支持分析函数,那么 RANK() 提供了另一种解决方法...
SQL> select name
2 , email_address
3 , order_date
4 from (
5 select c.name
6 , c.email_address
7 , o.order_date
8 , rank () over (partition by c.customer_no
9 order by o.order_date desc ) as rnk
10 from customers c
11 join orders o
12 on ( o.customer_no = c.customer_no)
13 )
14 where rnk = 1
15 /
NAME EMAIL_ADDRESS ORDER_DAT
-------------------- ------------------------- ---------
ACME Industries info@acme.com 07-APR-10
Tyrell Corporation accounts@tyrellcorp.com 26-MAR-10
SQL>
这也只返回带有订单的客户的行。