2016-06-01 45 views
0

我试图用locationID更新人员表。但是,我只想在一个人只有一个地址时更新位置。更新值不包含在子查询中选择语句

我试图拼凑一个子查询。但是,如果我在选择语句中包含地址的locationUD,那么它给了我所有人,甚至包含2个实际地址的人(因为他们不是住在一个地址多次)。

如何重写我的只有在某个人出现在子查询中而没有在select语句中包含locationID的情况下,查询才能更新locationID?

update p set locationID = n2.locationID 
--select * 
from 
    Personnel p 
    inner join (select p.personID, 
     count(*) AS 'Num of Households/Addresses' 
     --select * 
    from Person pe 
    inner join Address a on a.personID = pe.personID 
    group by pe.personID 
    having count(*) = 1) n2 on n2.personID = p.personID 

回答

2

您可以使用一个技巧。如果只有一个匹配,则min()max()得到你的价值,从该行:

update p 
    set locationID = n2.locationID 
from Personnel p inner join 
    (select a.personID, max(a.locationid) as locationid 
     from Address a 
     group by a.personID 
     having count(*) = 1 
    ) n2 
    on n2.personID = p.personID; 

注意,不需要在子查询中的person表。您可以使用Address表中的值。

相关问题