2010-12-07 2 views
0

データベースからデータをエクスポートしようとしていて、 "customers"テーブルを "orders"テーブルに結合しようとしています。顧客が複数の注文を行うことができる1対多の関係です。私は顧客のテーブルからemail_address、ファーストネーム、姓の基本的な顧客情報を返すクエリーを作成しようとしていますが、最後に注文した日付も含みます。クエリの正しい結合ステートメントを見つけるのに問題がある

customers as c 
- customer_id 
- firstname 
- lastname 
- email_address 

orders as o 
- orders_id 
- customers_id 
- purchase_date 

私は結果は購入日、顧客が作った最後の購入で、顧客ごとに単一の結果を返すようにしたいです。

c.firstname、c.lastname、c.email_address、o.purchase_date

これを実現するための正しいSQL構文とは何ですか?

+0

正しいジョインが見つからない場合は、LEFT JOINを代わりに使用してみてください。 –

+0

お客様が注文していない場合はどうなりますか?顧客と関連しない注文はありますか? –

+0

"RIGHT JOIN"または "正しい結合"を意味しましたか? – APC

答えて

1
select c.*, o.LastOrderDate 
from customers c 
LEFT JOIN 
(select customers_id, max(purchase_date) as LastOrderDate 
from orders 
group by customers_id) o on o.customers_id=c.customers_id 

すべての顧客と最後の注文の日付があればそれを取得します。

0

何について:

SELECT c.firstname, c.lastname, c.email_address, MAX(o.purchase_date) 
    FROM customers AS c 
    JOIN orders AS o ON o.customers_id = c.customer_id 
GROUP BY c.firstname, c.lastname, c.email_address 

少なくとも一つの順序を置いたこのリストのみの顧客。すべての顧客が必要な場合は、単純な(INNER)JOINの代わりにLEFT JOINを使用する必要があります。

0

これは関係なく、すべての注文を持っているかどうかに、すべての顧客を返す:

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> 

これだけのご注文をお持ちのお客様のための行を返します。

関連する問題