我正在加入两个表,一个有缺陷,另一个有缺陷状态。缺陷状态表通常对每个缺陷都有多行。
select d.defectID, d.defectName, ds.status
from (
select d.defectID d.defectName, ds.status,
row_number() over (partition by ds.defectID order by ds.updateTimestamp desc) as rn
from defect d left join DefectStatus ds
on d.defectID=ds.defectID) as
T
where rn=1
只要存在缺陷状态,查询就会起作用。当状态记录不存在时,不返回缺陷记录。当然使用了左连接,但where子句阻止它包含在结果集中。请告知是否有更好的方法来检索具有状态的所有缺陷记录(如果有)。
答案 0 :(得分:0)
我认为OUTER APPLY
可以为您要实现的目标提供更清晰的查询:
SELECT d.defectID, d.defectName, T.status
FROM Defect AS d
OUTER APPLY (
SELECT TOP 1 ds.Status
FROM DefectStatus AS ds
WHERE d.defectID = ds.defectID
ORDER BY ds.UpdateTimestamp DESC
) T
使用上述查询,您可以获取来自Defect数据的所有记录,这些记录由DefectStatus中的最新相关记录加入,以防这些记录存在。