2017-09-01 125 views
0

我正在使用SQL Server并想要更新具有特定条件的表。这里的前提是:更新SQL表而不创建重复项

 
Feature: 
ID FeatureName ApplicationId 
1 Car   5 
2 Car   6 
3 Ship   5 
 
Application: 
ID ApplicationName 
5 Mobile 
6 Server 

现在我想达到两个目的:

  1. 如果将在Feature表中的重复条目后更新然后删除旧的条目。
  2. 在表Feature集合ApplicationId6(= Server)其中当前ApplicationId是5(= Mobile)。

因此,最终Feature表应该是这样的:

 
Feature: 
ID FeatureName ApplicationId 
2 Car   6 
3 Ship   6 

我怎样才能做到这一点?

+2

你说要6其中值是5,而你的结果是5,而不是6 – jarlh

+0

@jarlh当然,我已经改正了错误。 –

回答

1

试试这个:只有

UPDATE Feature SET ApplicationId = 6 WHERE ApplicationId = 5 

DELETE FROM Feature 
LEFT OUTER JOIN (
    SELECT MIN(ID) as RowId, FeatureName, ApplicationId 
    FROM Feature 
    GROUP BY FeatureName, ApplicationId 
)as KeepRows ON 
    Feature.ID = KeepRows.RowId 
WHERE 
    KeepRows.RowId IS NULL 
1

更新有许可证修改exsiting记录,并且不能删除或常添加任何东西。我建议只做一次更新以及删除查询:

UPDATE Feature 
SET ApplicationId = 6 
WHERE ApplicationId = 5 

WITH cte AS (
    SELECT ID, FeatureName, ApplicationId, 
     ROW_NUMBER() OVER (PARTITION BY FeatureName, ApplicationId ORDER BY ID) rn 
    FROM Feature 
) 

DELETE FROM cte WHERE rn > 1; 
0

希望这会有所帮助。

update feature set applicationid = 6 where applicationid = 5; 


delete from feature where id in (
    select min(id) 
    from feature 
    where featurename in 
      (select featurename 
      from feature f2 
      group by featurename 
      having count(featurename) > 1) 
    and applicationId in 
      (select applicationid 
      from feature f3 
      group by applicationid 
      having count(applicationId) > 1) 
    group by featurename, applicationid; 
) 
; 
0
UPDATE F 
SET F.ApplicationId=(
case when F.ApplicationId=6 then (SELECT ID FROM #Application S WHERE ID=5) 
ELSE ApplicationId 
END) 
FROM #Feature F 

WITH CTE AS 
(
SELECT ID, FeatureName, ApplicationId , ROW_NUMBER() OVER(PARTITION BY FeatureName ORDER BY ApplicationId) rn 
FROM #Feature 
) 

DELETE FROM CTE 
WHERE rn>1 

SELECT * FROM #Feature 
相关问题