0

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

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

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 函数,并且如果没有在函数中,我也不能在 have 子句中拥有字段。

我可能在这里遗漏了一些非常简单的东西。但我想不通。

任何帮助表示赞赏。

编辑:我很抱歉应该解释表的结构,目的地是单个记录,LiveCalls 表可以根据目的地 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
4

2 回答 2

2

您缺少的简单内容GROUP BY语句

正如 JNK 在下面的评论中提到的,如果您没有子句,则不能使用聚合函数(例如COUNT, AVG, SUM, ),除非您的语句仅引用文字值(并且没有列名)。MINGROUP BYSELECT

你的代码可能应该是这样的:

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 语句中明确指定所选字段(*不允许)。

于 2012-04-11T14:43:07.613 回答
1

您只能使用具有聚合。实际上有聚合的“where子句”,但是你仍然可以在你没有聚合的列上有一个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
于 2012-04-11T14:49:59.293 回答