我有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
这将返回2个唯一记录(1个用于Tank,1个用于Bonnie),但每当我尝试获取任何其他DogsStatus和/或状态信息时,我要么只返回一个狗记录,要么全部3个Tanks DogsStatus记录。
提前致谢。
答案 0 :(得分:1)
您需要将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
这些方面的东西。
答案 1 :(得分:0)
你很亲密。您只需返回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
您可能希望对其中一些使用LEFT连接,然后更改选择列表以使用coalesce()表达式来清理NULL。
答案 2 :(得分:0)
会是这样的,我相信你能够根据自己的需要调整它:
;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