2015-06-18 53 views
0

我正在寻找外键不同的记录上的重复地址。这给了我重复:确定具有重复值和唯一值的记录

select quoteID, insuredID, Address1, PolicyID 
from quote 
where 
address1 in(select address1 from quote group by address1 having count(address1) > 1) 
and datalength(address1) <> 0 
order by address1 

我想过滤掉所有记录,其中的保险标识是相同的。我真的需要在结果中保留quoteID,以便我可以调查问题帐户。我正在使用SQL Server 2008.

+0

[SELECT语句来找到某些字段重复]的可能重复(http://stackoverflow.com/questions/4434118/select-statement-to-find-duplicates-on-certain-fields) –

回答

0

使用窗口函数。如果我理解你想要的逻辑:

select q.* 
from (select q.*, 
      min(insuredId) over (partition by address1) as minii, 
      max(insuredId) over (partition by address1) as maxii 
     from quote 
     where datalength(address1) <> 0 
    ) q 
where minii <> maxii; 

如果我有列错误,那么类似的东西可能是你想要的。

我假设你有一个很好的理由使用datalength(),而不仅仅是len()

+0

我我是SQL新手,发现如何消除这个网站上的空白。我只是用len换掉了数据长度,这也起作用 - 将不得不阅读它的差异。我尝试了一个稍微修改过的建议版本,它使我更接近......谢谢 - 如果我得到我想要的结果,我将继续完善该amd标记。 –

0

如果我理解你正确,你只想找到那些记录有相同的地址,但不同的insuredId。

下面的查询应该这样做,首先它抓住所有重复的地址记录像你一样,然后加入它拔出来只记录与这些地址。然后按地址和被保险人组合在一起,只抓取记录数为1,大于1意味着他们共享相同的被保险人ID和地址,这是不是你想要的。

select quoteID, insuredID, Address1, PolicyID 
from quote 
    inner join (select Address1, insuredID 
    from quote 
     inner join (select address1 from quote where address1 IS NOT NULL group by address1 having count(address1) > 1) T1 on quote.address1 = T1.address1 
    group by insuredID, Address1 
    having count(address1) = 1) T2 on quote.address1 = T2.address1 and quote.insuredID = T2.insuredID 
order by address1 
相关问题