我有一个包含Customers,Subscriptions和Publications表的订阅数据库。从SQL查询中排除可能结果的最有效方法是什么?
订阅表包含所有订阅记录,每个记录有三个标志来标记状态:isActive,isExpire和isPending。这些是布尔值,只有一个标志可以为真 - 这是由应用程序处理的。
我需要确定所有未更新他们之前订阅的杂志的客户,而且我不确定自己是否编写了最有效的SQL查询。如果我发现已经失效的订阅,那么如果他们已经拥有该特定杂志的活动订阅或待定订阅,我需要忽略它。
这是我有:
SELECT DISTINCT Customers.id, Subscriptions.publicationName
FROM Subscriptions
LEFT JOIN Customers
ON Subscriptions.id_Customer = Customers.id
LEFT JOIN Publications
ON Subscriptions.id_Publication = Publications.id
WHERE Subscriptions.isExpired = 1
AND NOT EXISTS
(SELECT * FROM Subscriptions s2
WHERE s2.id_Publication = Subscriptions.id_Publication
AND s2.id_Customer = Subscriptions.id_Customer
AND s2.isPending = 1)
AND NOT EXISTS
(SELECT * FROM Subscriptions s3
WHERE s3.id_Publication = Subscriptions.id_Publication
AND s3.id_Customer = Subscriptions.id_Customer
AND s3.isActive = 1)
我刚刚超过50,000订阅记录,此查询需要近一个小时运行,它告诉我,有很多循环或一些事情,其中的每条记录的SQL引擎必须再次搜索才能找到任何'isPending'和'isActive'记录。
这是我的第一篇文章,所以请温柔,如果我错过了我的问题中的任何信息:)谢谢。
它正在运行什么硬件? –
在你的数据库中,我认为订阅表中的每一行都是'订阅'的'续订'是否正确?我的意思是假设客户拥有一本杂志,并且子分期到2015年12月。当他续订订阅时,它是否在订阅表中创建了新行,还是仅仅将状态转回到活动状态? –
Windows Server 2012 R2 Essentials 64位 Intel Xeon CPU E3-1220 v3 @ 3.10Ghz 4Gb RAM –