******** ********* EDITED
基本上我最终要找的是最后一次预约狗在我们的商店里的详细信息。如你所知,现在我只是拉了MAX日期,我们的客户实际上已经预订了一整年,所以我没有得到他们的最后一次预约,但他们的最后一次预约将来会被预订。
SELECT dbo_Pet.petId,
dbo_Pet.petName,
dbo_Customer.cstLName,
dbo_vwApptGrid.aptDate,
dbo_vwApptGrid.aptId,
dbo_vwApptGrid.GroomStyle,
dbo_vwApptGrid.StatusDescr
FROM (dbo_Customer RIGHT JOIN dbo_Pet ON dbo_Customer.[cstId] = dbo_Pet.[petCustId])
LEFT JOIN dbo_vwApptGrid ON dbo_Pet.petId = dbo_vwApptGrid.aptPetId
WHERE (((dbo_Pet.petId)=[ID])
AND ((dbo_vwApptGrid.aptDate)<=Date())
AND ((dbo_vwApptGrid.aptDate)=(SELECT Max(tMax.aptDate)
FROM dbo_vwApptGrid As tMax
WHERE tMax.aptPetId = dbo_Pet.petId)));
根本没有显示任何记录。如果我将最大日期更改为大于今天,它会显示上次预约的约会,就像它应该的那样。 为什么这不会将我的最大日期限制为低于今天?
答案 0 :(得分:1)
有多种方法可以解决这个问题,但我更喜欢使用总计子查询进行过滤(对我想要的内容感觉最具描述性)。
由@ June7评论的解决方案也是有效的(特别是如果您不需要他/她提到的字段)。
添加其他条件时,请始终将这些条件添加到子查询中,永远不要添加到主查询中。如果将它们添加到主查询中,则无法获得任何结果,因为子查询将返回被过滤掉的内容。
SELECT dbo_Pet.petName
,dbo_Customer.cstLName
,dbo_vwApptGrid.aptId
,dbo_vwApptGrid.aptDate AS most_recent
,dbo_vwApptGrid.GroomStyle
,dbo_vwApptGrid.StatusDescr
FROM (
dbo_Customer RIGHT JOIN dbo_Pet ON dbo_Customer.[cstId] = dbo_Pet.[petCustId]
)
LEFT JOIN dbo_vwApptGrid ON dbo_Pet.petId = dbo_vwApptGrid.aptPetId
WHERE dbo_Pet.petId = [ID]
AND dbo_vwApptGrid.aptDate = (SELECT Max(tMax.aptDate) FROM dbo_vwApptGrid As tMax WHERE tMax.aptPetId = dbo_Pet.petId AND tMax.aptDate <= Date());