2

私は2つのテーブルを持っています

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

description long varchar

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

delievryid int

statusid int

recordtime timestamp

私がやろうとしているのは、各配信のDeliveryHistoryの最新のエントリのみを使用して、テーブルDeliveryからすべてのレコードを戻すための左外部結合です。ただし、DeliveryHistoryに配信のエントリがない場合は、null値が必要です。

私はこれをしました:

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にエントリがある行のみが返されます。

4

4 に答える 4

2

where句を使用すると、すべてのnull値が除外されます。試す

where  h.RecordTime is null OR
       h.recordtime =
       ( SELECT MAX(recordtime)
           FROM Deliveryhistory
          WHERE deliveryid = d.deliveryid)
于 2012-08-01T17:31:14.343 に答える
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)
于 2012-08-01T17:31:08.050 に答える
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
于 2012-08-01T17:35:38.833 に答える
0

maxrowを生成するCTE(実装がCTEをサポートするIFF;-)に加えて、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
        ;
于 2012-08-01T17:46:12.307 に答える