Проверка на несколько строк SQL - PullRequest
0 голосов
/ 12 января 2012

У меня есть две таблицы в базе данных со следующими столбцами:

Table1

athleteId | sportTypeId
 205      |    5
 206      |    5
 206      |    6
 207      |    4
 208      |    1
 208      |    4

Из-за ошибки, которую я сделал (упс), во второй таблице есть такая информация:

Table2 *

athleteId | sportTypeId
  205     |    4
  206     |    4
  207     |    4
  208     |    4
  NULL    |    4

Я присвоил неправильный athleteId некоторым спортсменам, поэтому мне нужно проверить каждую строку в Table2 и посмотреть, есть ли в ней соответствующая строка в Table1. Строки, содержащие athleteId 205 и 206 из Table2, будут иметь athleteId, установленный в NULL (у них нет sportTypeId из 4 в Table1). athleteId 207 и 208 останутся (у них есть строка в Table1 с sportTypeId of 4).

Обратите внимание, что некоторые спортсмены появляются дважды в Table1.

Я использую SQL Server 2008.

Спасибо!

Ответы [ 2 ]

1 голос
/ 12 января 2012
update table2 set athleteid = null where not exists (
    select *
    from table1
    where athleteid = table2.athleteid and sporttypeid = table2.sporttypeid
)
1 голос
/ 12 января 2012

Просто чтобы прояснить, вы запрашиваете способ удаления строк из 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 в нольвместо удаления всей строки, это небольшая модификация:

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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...