Sql server 2008 根据某些组更新特定记录
我使用的是Sql server 2008 根据某些组更新特定记录,sql-server-2008,sql-server-2008-r2,Sql Server 2008,Sql Server 2008 R2,我使用的是SQLServer2008R2 我有一个数据库表,其中包含一些用户数据,如下所示: Id UserId Sys Dia ReadingType DataId IsDeleted 1 10 98 65 last 1390556024216 0 2 10 99 69 average 1390556024216
SQLServer2008R2
我有一个数据库表,其中包含一些用户数据,如下所示:
Id UserId Sys Dia ReadingType DataId IsDeleted
1 10 98 65 last 1390556024216 0
2 10 99 69 average 1390556024216 0
3 10 102 96 last 1390562788540 0
4 10 102 96 average 1390562788540 0
5 11 130 98 last 1390631241547 0
6 11 130 98 average 1390631241547 0
7 2 285 199 first 1390770562374 0
8 2 250 180 last 1390770562374 0
9 2 267 189 average 1390770562374 0
10 1 258 180 first 1391191009457 0
11 1 258 180 last 1391191009457 0
12 1 258 180 average 1391191009457 0
13 1 285 199 additional 1391191009457 0
14 22 110 78 last 1391549208338 0
15 22 123 83 last 1391549208349 0
在此表中,有些记录的数据ID相同,但读取类型不同
我想为具有ReadingType='last'
的记录设置IsDeleted=1
,并且具有具有ReadingType='average'
且具有相同数据ID、Sys、Dia和UserId的记录
因此,期望的结果应该是:
Id UserId Sys Dia Reading DataId IsDeleted
1 10 98 65 last 1390556024216 0
2 10 99 69 average 1390556024216 0
3 10 102 96 last 1390562788540 1
4 10 102 96 average 1390562788540 0
5 11 130 98 last 1390631241547 1
6 11 130 98 average 1390631241547 0
7 2 285 199 first 1390770562374 0
8 2 250 180 last 1390770562374 0
9 2 267 189 average 1390770562374 0
10 1 258 180 first 1391191009457 0
11 1 258 180 last 1391191009457 1
12 1 258 180 average 1391191009457 0
13 1 285 199 additional 1391191009457 0
14 22 110 78 last 1391549208338 0
15 22 123 83 last 1391549208349 0
此处,Id为3、5和11的记录应标记为已删除,因为它们具有相同的用户Id、Sys、Dia、DataId和ReadingType=“last”,而另一条记录具有相同的其他字段ReadingType=“average”
有谁能帮我找到这样的记录并更新它们吗?只需将更新与EXISTS子查询一起使用即可:
UPDATE T
SET IsDeleted=1
WHERE
ReadingType='last'
AND
EXISTS(SELECT * FROM T as T1
WHERE T1.ReadingType='average'
AND T1.DataId=T.DataId
AND T1.Sys=T.Sys
AND T1.Dia=T.Dia
AND T1.UserId=T.UserId
)
您可以通过多种方式解决问题,但在这里,我使用子查询来解决您的问题
UPDATE TABLE SET IsDeleted=1
WHERE DataId=(SELECT DataId FROM TABEL WHERE Reading='last')
伙计,在你发布任何答案之前,只需检查一下你的问题。您认为子查询将只返回DataId吗?这里很容易出错。同样,如果您仅从子查询中选择DataId,那么它也将为所有记录设置IsDeleted=1。我在贬低你的答案。非常感谢。这对我来说很管用+谢谢你友好的回答。