これは関係なく、すべての注文を持っているかどうかに、すべての顧客を返す:
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 [email protected] 07-APR-10
Tyrell Corporation [email protected] 26-MAR-10
Lorax Textiles Co [email protected]
SQL>
JOINをLEFT OUTERと同等です:RIGHT 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 [email protected] 07-APR-10
Tyrell Corporation [email protected] 26-MAR-10
Lorax Textiles Co [email protected]
SQL>
は顧客のための行を返します注文と注文が顧客(すなわち強制的な外部キー)を持たなければならないと仮定すると、それは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 [email protected] 07-APR-10
Tyrell Corporation [email protected] 26-MAR-10
SQL>
これだけのご注文をお持ちのお客様のための行を返します。
出典
2010-12-07 04:51:08
APC
正しいジョインが見つからない場合は、LEFT JOINを代わりに使用してみてください。 –
お客様が注文していない場合はどうなりますか?顧客と関連しない注文はありますか? –
"RIGHT JOIN"または "正しい結合"を意味しましたか? – APC