gpt4 book ai didi

SQL 查询选择优化

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

我正在使用 MS sqlserver 2005。我有一个查询需要根据日期进行过滤。假设我有一张包含电话号码和日期的表格。我需要在一个时间范围内(开始日期和结束日期)提供电话号码的数量。如果这些电话号码出现在过去,则不应计入结果计数。我正在做这样的事情:

select (phoneNumber) from someTbl
where phoneNumber not in (select phoneNumber from someTbl where date<@startDate)

这对我来说看起来效率不高(并且预成型需要花费太多时间导致一些副作用,这些副作用可能应该在不同的问题中提出) 我在 someTbl 中有大约 30 万行需要检查。

完成这项检查后,我还需要检查一件事。我有一个过去的数据库,其中包含另外 30K 的电话号码。所以我要添加

and phoneNumber not in (select pastPhoneNumber from somePastTbl)

那确实是钉在棺材上或压垮 Camel 的最后一根稻草,或者您用来解释致命状态的任何短语。

所以我正在寻找一种更好的方法来执行这 2 个操作。


更新我选择了 Alexander 的解决方案并以这种查询结束:

SELECT t.number
FROM tbl t
WHERE t.Date > @startDate
--this is a filter for different customers
AND t.userId in (
SELECT UserId
FROM Customer INNER JOIN UserToCustomer ON Customer.customerId = UserToCustomer.CustomerId
Where customerName = @customer
)
--this is the filter for past number
AND NOT EXISTS (
SELECT 1
FROM pastTbl t2
WHERE t2.Numbers = t.number
)
-- this is the filter for checking if the number appeared in the table before startdate
AND NOT EXISTS (
SELECT *
FROM tbl t3
WHERE t3.Date<@startDate and t.number=t3.number
)

谢谢吉拉德

最佳答案

因为它不只是将小于切换为大于。

select phoneNumber from someTbl where date > @startDate

接下来过滤掉somePastTbl

select s1.phoneNumber from someTbl s1
LEFT JOIN somePastTbl s2 on s1.phoneNumber = s2.phonenumber
where s1.date > @startDate and s2 IS NULL

更新

根据评论:

不到开始日期的月份

SELECT COUNT(s1.phoneNumber) FROM someTbl s1
LEFT JOIN somePastTbl s2 on s1.phoneNumber = s2.phonenumber
where DATEADD(MONTH,-1,@startDate) < s1.date AND s1.date < @startDate and s2 IS NULL

关于SQL 查询选择优化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16315986/

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