2017-01-11 9 views
0

У меня есть SQL таблицу, как это:SQL UPDATE только Дублирование

+------+------------+---------+---------+--------+ 
| id | x   | y  | z  | status | 
+------+------------+---------+---------+--------+ 
| 1 |  bla |  ja | 1  | 0 | 
| 2 |  blaa |  jaa | 2  | 0 | 
| 3 |  bla |  ja | 1  | 0 | 
| 4 |  blaaa | jaaa | 3  | 0 | 
| 5 |  blaa |  jaa | 2  | 0 | 
+------+------------+---------+---------+--------+ 

Я хочу обновить только столбец статуса повторяющихся строк, а не первый.

С этим утверждением я обновить каждый дубликат также первая строка дубликата строки:

UPDATE table INNER JOIN 
     (SELECT x, y, z FROM table GROUP BY x,y,z HAVING COUNT(id) > 1) 
dup 
     ON table.x = dup.x && table.y = dup.y && table.z = dup.z 
    SET status = '1' 

Но не тот имеет права, так как таблица должна выглядеть после заявления UPDATE, как это:

+------+------------+---------+---------+--------+ 
| id | x   | y  | z  | status | 
+------+------------+---------+---------+--------+ 
| 1 |  bla |  ja | 1  | 0 | 
| 2 |  blaa |  jaa | 2  | 0 | 
| 3 |  bla |  ja | 1  | 1 | 
| 4 |  blaaa | jaaa | 3  | 0 | 
| 5 |  blaa |  jaa | 2  | 1 | 
+------+------------+---------+---------+--------+ 

Надеюсь, вы можете мне помочь.

Большое спасибо.

+1

Пожалуйста, помечать вопрос с базой данных, которую вы используете. –

+0

Каков ваш ожидаемый результат? –

ответ

0

Я считаю, что это то, что вы хотите:

UPDATE table t INNER JOIN 
     (SELECT x, y, z, MIN(id) as minid 
     FROM table 
     GROUP BY x, y, z 
     HAVING COUNT(id) > 1 -- not strictly necessary, but why not? 
     ) dup 
     ON t.x = dup.x AND t.y = dup.y AND t.z = dup.z AND 
      t.id > dup.minid 
    SET status = 1; 

Это вычисляет минимальный id для каждой группы, а затем обновляет все остальные строки.

+0

Это работает отлично. Большое спасибо. :-) –

+0

Еще один вопрос: можно ли поместить идентификатор из каждой первой оригинальной записи в каждый дубликат? –

+0

@ wp-разработчик. , , Конечно. Просто используйте 'minid' в' set'. –

1

Просто играйте с выбранным статусом, как показано ниже, пока не появится список дубликатов, а затем обновите, как показано.

UPDATE table set status = '1' 
WHERE ID in (select id from(Select ROW_NUMBER() OVER (Partition By x,y,z,status) as dup,id) where dup>1) 

Не сказал РСУБД, так что это для SQL Server

 Смежные вопросы

  • Нет связанных вопросов^_^