我有5个与此查询相关的表和列:
我想知道所有的狗和它们的最新状况。为了进行测试,我使用以下记录:
到目前为止,我已经:
SELECT
d.CallName, b.Name AS 'Breed', d.Color, d.Sex, d.ChipNumber
FROM
Dogs d
JOIN
(SELECT
DogsID, MAX(StatusDate) as MaxStatusDate
FROM DogsStatus
GROUP BY DogsID) mds ON mds.DogsID = d.ID
JOIN
Breeds b ON b.ID = d.BreedID
这将返回两个独特的记录(一个坦克和邦尼一个),但每当我试图获得任何其他的DogsStatus和/或状态信息,我要么只返回一个狗记录,或全部3个坦克DogsStatus记录。
提前谢谢。
发布于 2014-05-05 20:58:57
您需要将MaxStatusDate
加入到DogsStatus
表中。这样,您将只获得最近的状态,在有多个状态的情况下。有点像
SELECT
d.CallName, b.Name AS 'Breed', d.Color, d.Sex, d.ChipNumber
FROM
Dogs d
innner join DogsStatus ds
ON d.dogsid = ds.dogs_id
JOIN
(SELECT
DogsID, MAX(StatusDate) as MaxStatusDate
FROM DogsStatus
GROUP BY DogsID) mds ON mds.DogsID = d.ID
JOIN
Breeds b ON b.ID = d.BreedID
AND mds.maxstatusdate = ds.statusdate
一些类似的东西。
发布于 2014-05-05 21:08:06
你离我很近。您只需要返回到DogStatus表就可以得到完整的记录。请注意,在这方面我更喜欢CTE,但是您现有的派生表(子查询)方法也很好:
With StatusDates As
(
SELECT
DogsID, MAX(StatusDate) as StatusDate
FROM DogsStatus
GROUP BY DogsID
), CurrentStatus As
(
SELECT ds.*
FROM DogStatus ds
INNER JOIN StatusDates sd ON sd.DogsID = ds.DogsID AND ds.StatusDate = sd.StatusDate
)
SELECT d.Name, b.Name As Breed, d.Color, d.Sex, d.ChipNumber
, s.Status, cs.StatusDate, c.Name As ContactName
FROM Dogs d
INNER JOIN CurrentStatus cs ON cs.DogsID = d.ID
INNER JOIN Breed b on b.ID = d.BreedID
INNER JOIN Status s on s.ID = cs.StatusID
INNER JOIN Contact c on c.ID = cs.ContactID
您可能希望对其中一些操作使用左联接,然后更改select列表以使用coalesce()表达式来清除NULL。
发布于 2014-05-05 21:08:13
它会是这样的,我相信你能适应你的需求:
;with x as (
select *, row_number() over(partition by d.DogsId order by StatusDate desc) as rn
from Dogs d
inner join DogsStatus on d.DogsId = ds.DogsId
)
select *
from x
where rn = 1
https://stackoverflow.com/questions/23481686
复制相似问题