2014-02-27 48 views
0

我有一个表SQL Server 2008中:选择一个记录,按

#tblA (mem_id int, type varchar(20), address1 varchar(20),group_id int) 

insert into #tblA (mem_id, type, address1,group_id) 
values (1,'self','abc St',1), 
     (2,'Child','abc St',1), 
     (3,'Child','xyz st',1), 
     (4,'spouse','pqr st',1), 
     (5,'Child','abc St',1), 
     (6,'Child','xyz st',1), 

     (7,'self','mno st',2), 
     (8,'Child','def St',2), 
     (9,'Child','def st',2), 

我要选择唯一的孩子和配偶谁住在不同的地址。同样,如果来自组的两个人住在与自己不同的地址,那么我只需要一个人。

这是预期的结果:

(3, 'Child', 'xyz st', 1), 
    (4, 'spouse', 'pqr st', 1), 
    (8, 'Child', 'def St', 2), 

消除ID2和ID5,因为它的地址是一样的ID1。消除id6因为我们已经得到id3的结果。消除id7,因为它是自我和id9,因为我们已经得到了相同地址的id8。

谢谢

回答

1

你的逻辑很复杂。以下查询采用首先获取所有候选“配偶”和“子女”记录的方法。然后,它选择使用row_number()其中之一:

select a.* 
from (select a.*, 
      row_number() over (partition by group_id, type order by mem_id) as seqnum 
     from tbla a 
     where a.type <> 'self' and 
      a.address1 <> (select address1 
          from tbla a2 
          where a2.group_id = a.group_id and 
           a2.type = 'self' 
         ) 
    ) a 
where seqnum = 1; 

你可以看到它在这个SQL Fiddle工作。