簡體   English   中英

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

[英]Search for value in column 1 use value from coulmn 2 to find other rows with same values in column 2

我有一個包含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中的Person。Delete person WHERE Name ='John'; 然后,這還應該刪除“居民”中與Johns personId相匹配的任何行。 現在,約翰在“居民”表中還有一個或多個與他相關的地址。 現在,當我刪除John時,我需要刪除“地址”表中他連接的所有地址。 作為最后一個約束,我需要確保沒有其他人連接到我將要刪除的地址。 如果連接了另一個人,則不應刪除表“地址”中的地址

查找不止一個人的地址:

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;

如果問題是要使“ 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條目本身。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM