SQL选择Where或Having

时间:2012-04-11 14:41:31

标签: sql sql-server-2005

我试图根据某些因素从表中获取一些记录。

其中一个因素只是同一个表上的字段,另一个是加入另一个表时,我想将连接表中的记录数与第一个表中的字段进行比较。以下是示例代码。

select * from tDestinations D 
left join tLiveCalls LC on LC.DestinationID = D.ID 
where D.ConfigurationID = 1486 
AND (D.Active = 1 AND D.AlternateFail > GETDATE())
-- Having COUNT(LC.ID) = D.Lines

现在从上面的代码中我不能在where子句中使用Count函数,并且我不能在having子句中有一个字段而不在函数中。

我可能在这里遗漏了一些非常简单的东西。但我无法弄明白。

任何帮助都表示赞赏。

编辑:我道歉应该已经解释了表的结构,Destinations是单个记录,LiveCalls表可以根据Destinations ID(外键)保存多个记录。

非常感谢大家的帮助。我的最终代码:

select D.ID, D.Description, D.Lines, D.Active, D.AlternateFail, D.ConfigurationID, COUNT(LC.ID) AS LiveCalls from tDestinations D 
left join tLiveCalls LC on LC.DestinationID = D.ID 
where D.ConfigurationID = @ConfigurationID
AND (D.Active = 1 AND D.AlternateFail > GETDATE())
GROUP BY D.ID, D.Description, D.Lines, D.Active, D.AlternateFail, D.ConfigurationID
HAVING COUNT(LC.ID) <= D.Lines

2 个答案:

答案 0 :(得分:2)

你遗漏的简单事情是the GROUP BY statement

正如JNK在下面的评论中提到的,如果你没有,你不能使用聚合函数(例如COUNTAVGSUMMIN)除非GROUP BY语句仅引用文字值(并且没有列名),否则为SELECT子句。

您的代码应该类似于:

SELECT <someFields>
FROM tDestinations D 
LEFT JOIN tLiveCalls LC on LC.DestinationID = D.ID 
WHERE D.ConfigurationID = 1486 
AND (D.Active = 1 AND D.AlternateFail > GETDATE())
GROUP BY <someFields>
HAVING COUNT(LC.ID) = D.Lines

请注意,您必须在SELECT和GROUP BY语句中明确指定所选字段(不允许*)。

答案 1 :(得分:1)

您只能使用聚合。实际上有聚合的“where子句”,但是你仍然可以在列上没有聚合的位置。

例如:

SELECT TABLE_TYPE, COUNT(*)
FROM INFORMATION_SCHEMA.TABLES
where TABLE_TYPE='VIEW'
group by TABLE_TYPE
having COUNT(*)>1

在您的情况下,您需要使用havving count(*)= 1 所以,我认为您的查询将是这样的:

select YOUR_COLUMN 
from tDestinations D 
left join tLiveCalls LC on LC.DestinationID = D.ID 
where D.ConfigurationID = 1486 AND (D.Active = 1 AND D.AlternateFail > GETDATE())
group by YOUR_COLUMN
Having COUNT(LC.ID) = value