在第1列中搜索值,使用第2列中的值来查找第2列中具有相同值的其他行

时间:2013-09-19 17:57:45

标签: sql

我有一个包含3个表的简单数据库。

Person (personId[PK], Name, other stuff)
Addresses (AddressId[PK], roade, number, other stuff)
Residents ( personId[FK],AddressId[FK]) The two columns are the PK

如果他是唯一住在那里的人,我需要能够从数据库中删除一个人和他的地址。所以我需要能够找出更多的人是否住在同一个地址。如果是,那么如果不删除地址就让它保留。

我在想的是

我想删除表中的Person使用他的名字删除人员WHERE Name ='John'; 那么那也应该删除与Johns personId匹配的Residents中的任何行。 现在John还有一个或多个地址,在Residents表中连接到他。现在,当我删除John时,我需要删除表格地址中所连接的任何地址。 作为最后一个约束,我需要确保没有其他人连接到我要删除的地址。如果连接了另一个人,我不应该删除表格地址

中的地址

2 个答案:

答案 0 :(得分:0)

查找包含多个人的地址:

select r.AddressId
from Residents r
group by r.AddressId
having count(*) > 1;

为了得到所有人,你可以这样做:

selects personId
from Residents r join
     (select r.AddressId
      from Residents r
      group by r.AddressId
      having count(*) > 1
     ) a
     on r.AddressId = a.AddressId;

答案 1 :(得分:0)

如果问题是保持Addresses表没有未使用的条目,您只需删除那些在Residents中没有引用的行(一旦删除了后者)。

因此,假设您的外键未使用ON DELETE CASCADE定义,请先从Residents删除

DELETE FROM Residents
WHERE personId IN (
  SELECT personId
  FROM Person
  WHERE Name = 'Name'
);

然后你可以从Adresses中删除:

DELETE FROM Addresses
WHERE NOT EXISTS (
  SELECT *
  FROM Residents
  WHERE Residents.AddressId = Addresses.AddressId
);

当然,您也会删除Person条目本身。