2012-08-01 44 views
2

我有2个表加入与最近的战绩纪录上第二个表

Delivery 
-------- 
deliveryid int (PK) 

description long varchar 

DeliveryHistory 
--------------- 
historyid int 

delievryid int 

statusid int 

recordtime timestamp 

什么,我试图做的是一个左外连接带回从表交付的所有记录只在DeliveryHistory最新的条目为每个交付。然而,如果有在DeliveryHistory送货上门任何条目,我想一个空值

我已经这样做了:

select d.deliveryid,d.description, h.statusid from delivery d 
left outer join Deliveryhistory h on d.deliveryid = h.deliveryid 
where h.recordtime = 
     (SELECT MAX(recordtime) 
      FROM Deliveryhistory 
      WHERE deliveryid = d.deliveryid) 

但它只返回那些在DeliveryHistory的条目行。

+1

尝试h.recordTime为空或h.RecordTime =(...) – YetAnotherUser 2012-08-01 17:29:59

回答

2

您的where子句导致排除所有空值。尝试

where h.RecordTime is null OR 
     h.recordtime = 
     (SELECT MAX(recordtime) 
      FROM Deliveryhistory 
      WHERE deliveryid = d.deliveryid) 
+0

完美。谢谢。 – user1247395 2012-08-01 18:11:32

1
select d.deliveryid,d.description, h.statusid from delivery d 
left outer join Deliveryhistory h on d.deliveryid = h.deliveryid 
where (h.recordtime = 
    (SELECT MAX(recordtime) 
     FROM Deliveryhistory 
     WHERE deliveryid = d.deliveryid) 
    or h.deliveryid = null) 
+0

这不起作用。只返回DeliveryHistory中的条目。 – user1247395 2012-08-01 17:46:23

0

现有的答案都需要,但如果你想做到这一点,而无需使用WHERE子句可以用以下结构。

SELECT d.deliveryid 
     ,d.description 
     , dh.statusid 
FROM Delivery d 
     LEFT OUTER JOIN (
      SELECT deliveryid, MAX(recordtime) AS recordtime 
      FROM DeliveryHistory 
      GROUP BY 
       deliveryid 
     ) dhm ON dhm.deliveryid = d.deliveryid     
     LEFT OUTER JOIN DeliveryHistory dh ON dh.deliveryid = dhm.deliveryid 
               AND dh.recordtime = dhm.recordtime 
0

CTE产生maxrow(IFF实现支持CTE ;-)加简单左连接与CTE。

WITH last AS (
     SELECT * FROM Deliveryhistory dh 
     WHERE NOT EXISTS (
       SELECT * 
       FROM Deliveryhistory nx 
       WHERE nx.deliveryid = dh.deliveryid 
       AND nx.recordtime > dh.recordtime -- no one is bigger: dh must be the max 
       ) 
     ) 
SELECT d.deliveryid, d.description, l.statusid 
FROM delivery d 
LEFT JOIN last l ON d.deliveryid = l.deliveryid 
     ;