检查多行SQL

时间:2012-01-12 01:42:04

标签: sql sql-server-2008

我在数据库中有两个表,其中包含以下列:

表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 sportTypeId4)中的1}}。 Table1athleteId 207会保留(208中有一行Table1)。

请注意,有些运动员在sportTypeId of 4中出现两次。

我正在使用SQL Server 2008。

谢谢!

2 个答案:

答案 0 :(得分:1)

为了清楚起见,您正在寻找一种方法来删除Table2Table1中没有匹配行的行,是吗?如果是这样,这是如何做到的:

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
)