2010-03-29 6 views
0

J'essaie d'écrire une requête SQL pour DB2 version 8 qui récupère l'ordre le plus récent d'une partie spécifique pour une liste d'utilisateurs. La requête reçoit un paramètre qui contient une liste de numéros customerId et le numéro partId. Par exemple,Recherche de la commande la plus récente pour un article particulier

Commander Tableau

OrderID 
PartID 
CustomerID 
OrderTime 

Je voulais d'abord essayer:

Select * from Order 
where 
    OrderId = (

     Select orderId 
     from Order 
     where 
     partId = #requestedPartId# and customerId = #customerId# 
     Order by orderTime desc 
     fetch first 1 rows only 
    ); 

Le problème avec la requête ci-dessus est qu'il ne fonctionne que pour un seul utilisateur et mes besoins de la requête pour inclure plusieurs utilisateurs.

Quelqu'un at-il une suggestion sur la façon dont je pourrais développer la requête ci-dessus pour travailler pour plusieurs utilisateurs? Si je supprime mon "récupérer seulement les 1 premières lignes", alors il retournera toutes les lignes au lieu des plus récentes. J'ai également essayé d'utiliser Max (OrderTime), mais je ne pouvais pas trouver un moyen de retourner le OrderId de la sous-sélection.

Merci!

Remarque: DB2 version 8 ne prend pas en charge la fonction SQL "TOP".

Répondre

0

Essayez le suivant. Je ne l'ai pas testé. L'idée est que vous trouviez d'abord toutes les commandes pour tous vos clients spécifiés. Ceux-ci seront regroupés et vous trouverez le plus grand délai de commande pour chaque client (combinaison de groupe par et max). C'est la requête foo, qui identifie les enregistrements dont vous avez besoin. Que vous le rejoignez avec votre table de commande pour récupérer les informations nécessaires pour ces commandes.

select o.* 
from order o inner join 
    (select customerId, max(orderTime) 
    from order o 
    where customerId in (#customerIds#) 
     and partId = #requestedPartId# 
    group by customerId) foo 
    on o.customerId = foo.customerId 
    and o.orderTime = foo.orderTime 

EDIT: La requête ci-dessus vous donne la dernière commande pour chaque client que vous avez spécifié sous la condition, qu'il n'y a qu'un seul ordre par client et OrderTime. Pour obtenir une seule commande, c'est légèrement différent. L'exemple suivant suppose que orderTime est unique, ce qui signifie qu'il n'y a pas deux commandes en même temps dans la base de données. Cela est généralement vrai si orderTime est enregistré en millisecondes.

select o.* 
from order o inner join 
    (select customerId, max(orderTime) 
    from order o 
    where customerId in (#customerIds#) 
     and partId = #requestedPartId#) foo 
    on o.orderTime = foo.orderTime 
+0

Cela fonctionnera tant que deux commandes du même client ne sont pas placées exactement à la même milliseconde. Merci pour l'exemple. – visitor