我试图根据某些因素从表中获取一些记录。
其中一个因素只是同一个表上的字段,另一个是加入另一个表时,我想将连接表中的记录数与第一个表中的字段进行比较。以下是示例代码。
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
答案 0 :(得分:2)
你遗漏的简单事情是the GROUP BY
statement。
正如JNK在下面的评论中提到的,如果你没有,你不能使用聚合函数(例如COUNT
,AVG
,SUM
,MIN
)除非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