我有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中有条目的行。
答案 0 :(得分:2)
您的where子句导致排除所有空值。试试
where h.RecordTime is null OR
h.recordtime =
( SELECT MAX(recordtime)
FROM Deliveryhistory
WHERE deliveryid = d.deliveryid)
答案 1 :(得分: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)
答案 2 :(得分: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
答案 3 :(得分: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
;