2014-02-27 81 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工作。