我在数据库中有两个表,其中包含以下列:
表1
athleteId | sportTypeId
205 | 5
206 | 5
206 | 6
207 | 4
208 | 1
208 | 4
由于我犯了一个错误(哎呀),第二个表有一些这样的信息:
表2 *
athleteId | sportTypeId
205 | 4
206 | 4
207 | 4
208 | 4
NULL | 4
我为一些运动员分配了错误的athleteId
,所以我需要检查Table2
中的每一行,看看它是否在Table1
中有匹配的行。包含来自athleteId 205
的{{1}}和206
的行会将Table2
设置为athleteId
(他们没有NULL
sportTypeId
在4
)中的1}}。 Table1
和athleteId 207
会保留(208
中有一行Table1
)。
请注意,有些运动员在sportTypeId of 4
中出现两次。
我正在使用SQL Server 2008。
谢谢!
答案 0 :(得分:1)
为了清楚起见,您正在寻找一种方法来删除Table2
中Table1
中没有匹配行的行,是吗?如果是这样,这是如何做到的:
DELETE t2.*
FROM Table2 AS t2
LEFT JOIN Table1 AS t1 ON t2.athleteId = t1.athleteId AND t2.sportTypeId = t1.sportTypeId
WHERE t1.athleteId IS NULL;
这可行的原因是左连接和where子句。只要在t1.athleteId
中找不到匹配的记录,左连接就会使Table1
为空。
编辑:如果您只想将athleteId
设置为null而不是删除整行,那么这是一个小修改:
UPDATE t2
SET t2.athleteId = null
FROM Table2 AS t2
LEFT JOIN Table1 AS t1 ON t2.athleteId = t1.athleteId AND t2.sportTypeId = t1.sportTypeId
WHERE t1.athleteId IS NULL;
答案 1 :(得分:1)
update table2 set athleteid = null where not exists (
select *
from table1
where athleteid = table2.athleteid and sporttypeid = table2.sporttypeid
)