0

このようなモデルを使用していると仮定すると

特定の製品を注文した最後の顧客をどのように見つけることができますか?
ここに画像の説明を入力

ここまできた

   SELECT customerNumber
FROM ORDERS
WHERE orderNumber = (SELECT  TOP 1 OrderNumber FROM orderDetails WHERE productCode = 1
ORDER BY orderDate DESCENDING)

今、私は立ち往生しています。サブクエリがどうあるべきかわからない。

4

2 に答える 2

1

customerNumber と productCode のみを取得するだけで十分であると考える必要があります。これらに関連付けられた詳細は単純な結合で取得できるためです (フロント エンドがそのように機能している場合は、フロント エンド コードから別のクエリを介して取得することもできます)。 )。

注文のリストを orderDate の降順で並べ替え、最初の注文を取得できます。

したがって、次のようになります。

select customerNumber
from (
  select o.customerNumber, rownum as r
  from Orders o, OrderDetails od
  where o.orderNumber = od.orderNumber
  and od.productCode = <given_product_code>
  order by o.orderDate desc
)
where r = 1;

Orders.orderDate に「降順」インデックスを作成すると、次のようになります。

create index orders_orderDate_desc on Orders(orderDate desc);

Oracleは再度ソートする代わりにインデックスを使用するため、クエリは非常に高速になります。

于 2012-10-30T19:19:36.837 に答える
0

より多くの情報が必要です。結合数は、表示するデータによって異なります。必要なのは顧客名と注文日だけである場合は、そのように達成できます (必要に応じて変数を追加します)。

        SELECT MAX(o.orderDate) AS lastOrder, c.customerName
        FROM Orders O, Customers C
        WHERE o.CustomerNumber = c.CustomerNumber
        ORDER BY lastOrder
于 2012-10-30T19:19:47.663 に答える