2014-07-10 28 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