2013-08-29 7 views
0

J'essaie de sélectionner un ensemble d'enregistrements à partir d'une table de commandes en fonction du dernier état de cet enregistrement. Le statut est conservé dans une autre table appelée orderStatus. Ma table est plus complexe, mais voici un exemple de baseSQL Sélectionnez les derniers enregistrements

table - commandes:

orderID 

table - OrderStatus:

orderStatusID 
orderID 
orderStatusCode 
dateTime 

Une commande peut avoir plusieurs enregistrements d'état, je Je veux simplement obtenir les commandes qui ont le dernier statusCode de ce que je demande. Le problème est que je reçois beaucoup de doublons. Voici un exemple de base.

select orders.orderID 
from orders inner join orderStatus on orders.orderID = orderStatus.orderID 
where orderStatusCode = 'PENDING' 

J'ai essayé de faire une requête interne pour sélectionner le top 1 de la table orderStatus ordonnée par dateTime. Mais je voyais toujours la même duplication. Quelqu'un peut-il me diriger dans la bonne direction sur la façon de s'y prendre?

edit: SQL server 2008

+0

Vous avez un enregistrement pour chaque ID de commande dans le tableau de l'état des commandes? Je suppose que non, donc vous avez besoin de grouper par orderID et ordre par 'dateTime'. 'SELECT orders.orderID FROM blablabla O order orderStatusCode = 'PENDING' GROUP PAR orders.orderID ORDER BY orderStatus.dateTime DESC' – Sal00m

+0

Si vous le limitez à un certain système de base de données (MySQL/SQL Server/Oracle/...) et peut-être même une version minimale, il peut y avoir des solutions plus simples. –

Répondre

2

Un LEFT JOIN simple à vérifier qu'aucun état récent existe sur un ordre devrait le faire très bien;

SELECT o.* 
FROM orders o 
JOIN orderStatus os 
    ON o.orderID = os.orderID 
LEFT JOIN orderStatus os2 
    ON o.orderID = os2.orderID 
AND os.dateTime < os2.dateTime 
WHERE os.orderStatusCode = 'PENDING' AND os2.dateTime IS NULL; 
0
select DISTINCT orders.orderID 
from orders inner join orderStatus on orders.orderID = orderStatus.orderID 
where orderStatusCode = 'PENDING' 

Comme alternative votre boîte GROUP BY

select orders.orderID 
from orders inner join orderStatus on orders.orderID = orderStatus.orderID 
where orderStatusCode = 'PENDING' 
GROUP BY orders.orderID 
0
select Distinct orders.orderID 
from orders inner join orderStatus on orders.orderID = orderStatus.orderID 
where orderStatusCode = 'PENDING' 
0

Essayez d'utiliser un sous sélectionner comme ceci:

Select 
    o.* 
FROM 
    Order o inner join OrderStatus os on o.order_id = os.order_id 
Where 
    os.orderstatus_id in (SELECT max([orderstatus_id]) FROM [OrderStatus] group by [order_id]) 
    And os.staus = 'pending' 
0

Essayez une sous-requête pour le datetime?

select orders.orderID 
from orders inner join orderStatus on orders.orderID = orderStatus.orderID 
where orderStatusCode = 'PENDING' AND (dateTime)=((SELECT MAX(dateTime) From orders 
as orders2 Where orders= orders2)) 
Questions connexes