2013-10-22 49 views
0

我需要在表中找到具有0保费的策略,但如果具有相同保单号的另一个策略具有保费,则不需要。这里是我的伪代码:查询其他记录的SQL子查询语法

select * from tblPolicies where premium = 0 
(but not if anther record has the same policyNumber and premium <> 0) 

我知道这是可怕的,但我迷路了,这是我能拿出最好的!

回答

1

可能的查询1:

SELECT M.* FROM tblPolicies AS M 
WHERE premium = 0 AND policyNumber NOT IN 
(
    SELECT S.policyNumber 
    FROM tblPolicies AS S 
    WHERE S.policyNumber = M.policyNumber 
    AND S.premium <> 0 
) 

可能的查询2:

SELECT SA.* FROM 
(
    SELECT M.* FROM tblPolicies AS M 
    WHERE premium = 0 
) AS SA 
INNER JOIN tblPolicies AS SB 
ON SA.policyNumber = SB.policyNumber 
WHERE SB.premium <> 0 

可能的查询3:

SELECT * FROM tblPolicies AS SA 
INNER JOIN tblPolicies AS SB 
ON SA.policyNumber = SB.policyNumber 
WHERE SA.premium = 0 AND SB.premium <> 0 
+0

+1很好的回答。人们也可以使用“NOT EXISTS”。 –

+0

这工作,我很欣赏它,但它是非常慢...无论如何,以提高性能? – daytonk

+0

你有关于policyNumber的索引吗?另外,表中有多少条记录?它是什么DBMS(SQL Server,MySQL,MS Access等)? – Linger

1
select p_no from 
(select p_no, sum(premium) as tot_prem from policy group by p_no) as pol 
where tot_prem>0; 

p_no->premium_no

策略 - >策略表