Помогите с селектом пож. sql 2000

Kon
Новичок
Posts: 84
Joined: 24 Jul 2002 20:42
Location: Chicago

Помогите с селектом пож. sql 2000

Post by Kon »

Дело происходит на sql 2000.

Code: Select all

Customer
---------------------------
CustomerID     OrderID
1                     1
1                     2
1                     3
2                     4
2                     5


Order
----------------------------
OrderID     Product
1              Стакан
2              Журнал
3              Чайник
4              Стакан
5              Ручка

Нужно выбрать самый последний продукт купленный покупателем.

Result
---------------------------
CustomerID   Product
1      Чайник
2      Ручка

Я написал это вот так:
select Customer.CustomerID, Order.Product from
Order join (select max(OrderID) Orderid from Customer group by CustomerID) c
on Order.Orderid=c.Orderid
join Customer
on Customer.Orderid=Order.Orderid




Как это написать умнее, чтоб без derived таблицы и побыстрее?
User avatar
roadman
Уже с Приветом
Posts: 707
Joined: 12 Mar 2003 22:29
Location: Moscow->Bay Area, CA

Post by roadman »

select c.CustomerId, o.Product from Customer c
inner join Order o on o.OrderId = (select max(OrderID) from Customer c1 where c1.CustomerID = c.CustomerId)
The philosophy of one century is the common sense of the next. --Henry Ward Beecher
vc
Уже с Приветом
Posts: 664
Joined: 05 Jun 2002 01:11

Re: Помогите с селектом пож. sql 2000

Post by vc »

Kon wrote:Дело происходит на sql 2000.

Code: Select all

Customer
---------------------------
CustomerID     OrderID
1                     1
1                     2
1                     3
2                     4
2                     5


Order
----------------------------
OrderID     Product
1              Стакан
2              Журнал
3              Чайник
4              Стакан
5              Ручка

Нужно выбрать самый последний продукт купленный покупателем.

Result
---------------------------
CustomerID   Product
1      Чайник
2      Ручка

Я написал это вот так:
select Customer.CustomerID, Order.Product from
Order join (select max(OrderID) Orderid from Customer group by CustomerID) c
on Order.Orderid=c.Orderid
join Customer
on Customer.Orderid=Order.Orderid




Как это написать умнее, чтоб без derived таблицы и побыстрее?


Your query contains an unecessary extra join. It should be:

Code: Select all

select c.CustomerID, Orders.Product 
from (select CustomerID, max(OrderID) Orderid from Customer group by CustomerID) c
join Orders
on c.Orderid=Orders.Orderid


'Order' , by the way, is a keyword and Yukon does not allow it.

VC
vc
Уже с Приветом
Posts: 664
Joined: 05 Jun 2002 01:11

Post by vc »

roadman wrote:select c.CustomerId, o.Product from Customer c
inner join Order o on o.OrderId = (select max(OrderID) from Customer c1 where c1.CustomerID = c.CustomerId)


The above query is incorrect as it'll produce duplicates. It should be :

Code: Select all


select c.CustomerID, o.Product
from Customer c join Order o
on c.Orderid=o.Orderid and c.Orderid = (select max(Orderid) from Customer where Customerid=c.Customerid)



VC
vovap
Уже с Приветом
Posts: 12014
Joined: 05 Apr 2000 09:01
Location: Philadelphia, PA, USA

Post by vovap »

Ну зачем же усложнять?

Select Top 1 ...
Order by OrderID desc
vc
Уже с Приветом
Posts: 664
Joined: 05 Jun 2002 01:11

Post by vc »

vovap wrote:Ну зачем же усложнять?

Select Top 1 ...
Order by OrderID desc


... and ... ?

VC
vovap
Уже с Приветом
Posts: 12014
Joined: 05 Apr 2000 09:01
Location: Philadelphia, PA, USA

Post by vovap »

vc wrote:
vovap wrote:Ну зачем же усложнять?

Select Top 1 ...
Order by OrderID desc


... and ... ?

VC

Что "аnd"? Посредине вставляется любое соединение, которое необходимо вывести.
vc
Уже с Приветом
Posts: 664
Joined: 05 Jun 2002 01:11

Post by vc »

vovap wrote:
vc wrote:
vovap wrote:Ну зачем же усложнять?

Select Top 1 ...
Order by OrderID desc


... and ... ?

VC

Что "аnd"? Посредине вставляется любое соединение, которое необходимо вывести.


Then just do it and show what you mean.

VC

Return to “Вопросы и новости IT”