我想知道是否有人可以将注意力集中在我试图执行的查询上,我无法想到最好的方法。
我需要Contact表中的Email,Firstname和Surname以及热线表中的HotlineID和Last Action。我想过滤存储在热线表中的'flag'列,只显示值为1的行。我通过此查询实现了这一点:
select Email, FirstName, Surname, HotlineID, LastAction
from Hotline
left join contact on contact.companyid=hotline.CompanyID
and contact.ContactID=hotline.ContactID
where
hotline.Flag = 1
现在我不能这样做。在“操作表”中,有3列“HotlineID”“注释”“日期”,“操作表”中的热线ID链接到热线表中的热线ID。可以为每条热线添加多条评论,并将其发布日期记录在日期列中。
在第一个查询的返回行中,我想进一步过滤掉最大日期(最后记录的评论)比当前日期晚48小时的任何行。我在visual studio中使用'addwithvalue'来填充日期变量,但出于测试目的,我使用'2014-12-04'
我想出了这个,但失败了。但我不确定为什么?
Select Email, FirstName, Surname, hotline.HotlineID, LastAction
from Hotline
left join Contact on Contact.CompanyID=Hotline.CompanyID
and Contact.ContactID=Hotline.ContactID
inner join Actions on actions.HotlineID=hotline.HotlineID
where hotline.flag=1 and CONVERT(VARCHAR(25), Max(Date), 126) LIKE '2014-12-03%'
我正在使用SQL Server。
答案 0 :(得分:1)
MAX()
是一组行的聚合函数。如果它出现在选择列表中,它的使用会将您的普通查询转换为聚合查询,这似乎不是您想要的。显然,SQL Server根本不会在你的where子句中接受它。
看起来你想要这样的东西:
SELECT
Contact.Email,
Contact.FirstName,
Contact.Surname,
recent.HotlineID,
Hotline.Action
FROM
(SELECT HotlineID, MAX([Date]) as maxDate
FROM Hotline
GROUP BY HotlineID) recent
INNER JOIN Hotline
ON recent.HotlineId = Hotline.HotlineId
LEFT JOIN Contact
ON Hotline.HotlineId = Contact.HotlineId
WHERE
datediff(hour, recent.maxDate, GetDate()) < 48
AND Hotline.Flag = 1
可能您希望将WHERE
子句放在子查询中。结果查询的含义与上面的查询略有不同,我不确定你真正想要的是什么。
答案 1 :(得分:0)
你可以试试这个
Select Email, FirstName, Surname, hotline.HotlineID, LastAction
from Hotline
left join Contact on Contact.CompanyID=Hotline.CompanyID
and Contact.ContactID=Hotline.ContactID
inner join Actions on actions.HotlineID=hotline.HotlineID
where hotline.flag=1
and CONVERT(VARCHAR(25), Max(Date), 126) < CONVERT(VARCHAR(25), GetDate() - 2, 126)
答案 2 :(得分:0)
John的查询在使用派生表中的Hotlines表而不是Actions表之外是好的。
SELECT Email, FirstName, Surname, HotlineID, LastAction
FROM Hotline h
INNER JOIN
(SELECT hotlineID, max(date) as Date FROM actions a1 GROUP BY hotlineID) a
ON h.hotlineID = a.hotlineID
LEFT JOIN contact c
ON c.companyid=h.CompanyID and c.ContactID=h.ContactID
WHERE
hotline.Flag = 1
and datediff(hour,[Date],getdate()) > 48