0

以下のデータがあります。

table A

id   

1

2

3

table B

id       name      data1        data2     datetime

1        cash      12345.00                12/12/2012 11:10:12

1        quantity   222.12                  14/12/2012 11:10:12

1        date     20/12/2012               12/12/2012 11:10:12

1        date     19/12/2012                13/12/2012 11:10:12

1        date     13/12/2012                14/12/2012 11:10:12

1        quantity   330.10                   17/12/2012 11:10:12

以下のように1行でデータを取得したい:

tableA.id      tableB.cash        tableB.date     tableB.quantity 

1               12345.00          13/12/2012       330.10

max(datetime)に基づいて取得したい。

4

2 に答える 2

2

データ モデルは正気ではないようです。 を に結合しても意味がありませORDER_IDCUSTOMER_IDVARCHAR2列に日付を格納しても意味がありません。CUSTOMERaと an の間に関係がないのは意味がありませんORDERORDERテーブルに2 つの行が同じであっても意味がありませんORDER_IDORDERも予約語なので、テーブル名として使用することはできません。私の最善の推測は、あなたが次のようなものが欲しいということです

select * 
  from customer c 
       join (select order_id, 
                    rank() over (partition by order_id 
                                     order by to_date( order_time, 'YYYYMMDD HH24:MI:SS' ) desc ) rnk
               from order) o on (c.customer_id=o.order_id)
 where o.rnk = 1

それがあなたが望むものではない場合は、(コメントで何度か尋ねたように)期待される出力を投稿してください。

これらは、クエリとサンプル データで取得した結果です (ORDER実際に有効になるようにテーブルの名前を修正しています) 。

SQL> ed
Wrote file afiedt.buf

  1  with orders as (
  2    select 1 order_id, 'iphone' order_name, '20121201 12:20:23' order_time from dual union all
  3    select 1, 'iphone', '20121201 12:22:23' from dual union all
  4    select 2, 'nokia', '20110101 13:20:20' from dual ),
  5   customer as (
  6    select 1 customer_id, 'paul' customer_name from dual union all
  7    select 2, 'stuart' from dual union all
  8    select 3, 'mike' from dual
  9  )
 10  select *
 11    from customer c
 12         join (select order_id,
 13                      rank() over (partition by order_id
 14                                       order by to_date( order_time, 'YYYYMMDD HH24:MI:SS' ) desc ) rnk
 15                 from orders) o on (c.customer_id=o.order_id)
 16*  where o.rnk = 1
SQL> /

CUSTOMER_ID CUSTOM   ORDER_ID        RNK
----------- ------ ---------- ----------
          1 paul            1          1
          2 stuart          2          1
于 2012-12-17T21:25:48.757 に答える
1

次のようなものを試してください

SELECT *
  FROM CUSTOMER c
  INNER JOIN ORDER o
    ON (o.CUSTOMER_ID = c.CUSTOMER_ID)
  WHERE TO_DATE(o.ORDER_TIME, 'YYYYMMDD HH24:MI:SS') =
    (SELECT MAX(TO_DATE(o.ORDER_TIME, 'YYYYMMDD HH24:MI:SS')) FROM ORDER)

共有してお楽しみください。

于 2012-12-17T19:57:08.733 に答える