gpt4 book ai didi

sql - 使用 HAVING 还是 WHERE?

转载 作者:行者123 更新时间:2023-12-02 02:30:30 25 4
gpt4 key购买 nike

我对何时使用 HAVING 和何时使用 WHERE 感到困惑。我需要

Find all of the bugs on software Debugger that pertain to the /main.html

这是我的查询

select Tickets.TicketID, b.Data
from Bugs b
Inner Join Tickets
On b.TicketID = Tickets.TicketID
Inner Join Softwares
on Software.SoftwareId = Tickets.SoftwareID
where Software.URL = 'http://debugger.com' and Tickets.Title = '/main.html'

注意:这给了我想要的结果但我想确保我没有错过任何重要的事情。也许我应该在这里使用 HAVING ?

此外,为了使查询在大型数据集上表现更好,我在外键上创建了索引

create nonclustered index IX_Tickets_SoftwareId
on [dbo].[Tickets] ([SoftwareId])
go
create nonclustered index IX_Bugs_TicketsId
on [dbo].[Bugs] ([TicketsId])

还好吗?

最佳答案

您的查询没问题。您想要过滤单个记录,这就是 WHERE 子句的作用。

HAVING 子句在聚合查询中发挥作用 - 使用 GROUP BY 的查询,其目的是过滤记录组,使用聚合函数(例如 SUM()MAX() 或类似函数)。对于不使用聚合的查询来说,这没有任何意义。

顺便说一句,我注意到您没有从 softwares 表中返回任何内容,因此该连接仅用于过滤。在这种情况下,我发现 exists 更合适,因为它的目的很明确:

select t.ticketid, b.data
from bugs b
inner join tickets t on b.ticketid = t.ticketid
where t.title = '/main.html' and exists (
select 1
from softwares s
where s.softwareid = t.softwareid and s.url = 'http://debugger.com'
)

为了提高性能,请考虑在 softwares(softwareid, url) 上建立索引,以便子查询高效执行。 tickets(ticketid, title) 上的索引也可能有所帮助。

关于sql - 使用 HAVING 还是 WHERE?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65117225/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com