我正在使用 ms sqlserver 2005。我有一个需要根据日期过滤的查询。假设我有一张包含电话号码和日期的表格。我需要在一个时间范围内(开始日期和结束日期)提供电话号码的计数。如果此电话号码出现在过去,则它们不应出现在结果计数中。我正在做这样的事情:
select (phoneNumber) from someTbl
where phoneNumber not in (select phoneNumber from someTbl where date<@startDate)
这对我来说看起来根本没有效率(并且它需要太多时间来执行导致一些可能应该在另一个问题中提出的副作用)我在 someTbl 中有大约 300K 行应该检查。
在我做这个检查之后,我需要再检查一件事。我有一个过去的数据库,其中包含另外 30K 的电话号码。所以我要添加
and phoneNumber not in (select pastPhoneNumber from somePastTbl)
这真的钉了棺材或压垮骆驼的最后一根稻草,或者你用来解释致命状态的任何短语。
所以我正在寻找一种更好的方法来执行这两个动作。
更新
我选择使用亚历山大的解决方案并最终得到这种查询:
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
)
谢谢吉拉德