选择不在另一个表中的位置

时间:2012-03-02 14:25:41

标签: sql-server join

我正在尝试选择Quote或Policy表中不存在的所有提交。

select
COUNT (*)
from Submission S
where
(S.Submission_Status='New' OR S.Submission_Status='Quoted to Agent' OR S.Submission_Status='Cleared')
and YEAR(S.Submission_Date) >= YEAR( GETDATE())
and S.Submission not in (select distinct Submission from Policy where Submission is not null) 
and S.Submission not in (select distinct Submission from Quote where Submission is not null)

此查询返回了良好的结果,但查询速度极慢(因为Policy和Quote表中有很多记录)。是否有可能制作更快版本的查询(我想用JOIN)?

谢谢,
伊利亚·

编辑:
我试过这个,但结果与第一个查询不匹配:
enter image description here

5 个答案:

答案 0 :(得分:0)

在Submission_Status和S.Submission_Date,Submission

上添加索引

答案 1 :(得分:0)

select
COUNT (*)
from Submission S
where S.Submission_Status IN ('New','Quoted to Agent','Cleared')
and YEAR(S.Submission_Date) >= YEAR( GETDATE())
and S.Submission not in (select distinct Submission from Policy p FULL OUTER JOIN Quote q ON  p.Submission=q.Submission where Submission is not null)

答案 2 :(得分:0)

您可以使用LEFT OUTHER JOIN代替使用子选择检查Submission==null

基本上你需要得到不匹配的记录。

此链接可帮助您重构查询

Retrieve non matching record using join

答案 3 :(得分:0)

更改此部分:

YEAR(S.Submission_Date) >= YEAR( GETDATE())

要:

S.Submission_Date >= DateAdd(Year, DateDiff(Year, 0, GETDATE()), 0)

此代码将允许使用Submission_Date上的索引(如果存在)。它在功能上也与原始陈述相同。

答案 4 :(得分:0)

我尝试用not in替换not exist,这样你就不会distinct。终极解决方案 - 如果您确定由于policyquote中的大量记录而导致性能下降,请在每个表(select distinct …)上创建索引视图。在某些sqlserver版本中,您甚至不必更改查询,它将自动使用视图