2014-07-10 29 views
1

我有一個具有以下元素的哺乳動物屬性表;使用SQL Server刪除和替換表中的條目

MammalAttributeID AttributeID MammalID 

一些哺乳動物有「貓」(屬性Id 234)的屬性記錄,有些有「貓」(屬性Id 456)的屬性記錄和一些同時具有「貓」和「貓」屬性記錄。

我們想在哺乳動物屬性表中用「貓」替換「貓」的屬性並刪除「貓」屬性。因此,如果哺乳動物只有「貓科動物」屬性記錄,它將保持不變。如果它同時具有「貓」和「貓」屬性記錄條目,則「貓」屬性記錄被刪除。

如果它只有「cat」屬性記錄,則插入「貓」屬性記錄並刪除「cat」屬性記錄。

我無法將我的大腦包裝在執行此操作所需的SQL中。一些SQL專家可以指引我朝着正確的方向嗎?

+0

我只是做了兩遍。首先將每個貓屬性更新爲貓科動物。然後刪除重複項。 –

回答

2

我覺得奧爾加斯響應,因爲刪除首先發生會想念這裏的哺乳動物是貓而不是貓的情況下更換所有遺體「貓」 。

--update cats to felines 
Update "mammal attribute table" 
set AttributeID = 456 
where AttributeID=234 

go 

--delete cat attribute 
delete from attributetable where AttributeID=234 
go 

--delete duplicate feline attribute 
delete 
from "mammal attribute table" 
where mammalattributeid in(
     select max(mammalattributeid) 
     from "mammal attribute table" 
     group by mammalid,attributeid 
     having count(*)>1) 
+0

+1,但請注意您的UPDATE語句會暫時導致重複的'MammalID,AttributeID'條目。由於OP已經接受了你的回答,我想他們對這一對列沒有獨特的限制,但是在一個更加安全的環境中,你的方法是行不通的。此外,也許我錯過了一些東西,但我沒有看到奧爾加的方法有任何問題:DELETE確實首先發生,但它只從具有456屬性的哺乳動物中刪除234屬性,而UPDATE語句取代其餘部分。 –

0

假設這些列在不同的列中,您需要將第一列標準化,因此它們都是相同的,然後只刪除另一列。

Update [table] set [attribute1] = 'cat' where [attribute1]='feline' or [attribute2]='cat' 

然後,刪除所有其他:

delete from [table] where [attribute2]='feline' or [attribute2]='cat' 

應該這樣做。

+0

不,沒有重複列,這將打破標準化。 –

+0

數據如何存儲?分別記錄每個?如果是這樣的話,你可以改變我在那裏更新記錄,並吹走你不再需要的記錄。 – durbnpoisn

1

第1步。刪除具有「貓」屬性的行也用於具有「貓科動物」屬性的哺乳動物。

DELETE FROM [YOUR_TABLE] 
WHERE MammalID in 
(SELECT MammalID FROM [YOUR_TABLE] WHERE AttributeID = 234 -- cat 
INTERSECT 
SELECT MammalID FROM [YOUR_TABLE] WHERE AttributeID = 456) --feline 
AND AttributeID = 234 

第2步:用「貓」

UPDATE [YOUR_TABLE] 
SET AttributeID = 456 
WHERE AttributeID = 234 
+0

呃,對於既有貓又有貓科動物的哺乳動物來說,豈不是既沒有核心屬性?我們希望那些最終只有一個貓科動物屬性,而不是任何屬性。 –

+0

內部'選擇'獲得的行只有**兩個屬性,然後外部'刪除'只能刪除這些情況下的「貓」。它不會刪除沒有「貓科動物」屬性的哺乳動物的'貓'屬性。 – olga

+0

這是演示,希望它有助於解釋:http://sqlfiddle.com/#!6/65c5d/3 – olga