Обновить строки с повторяющимися значениями (в тех же столбцах) - PullRequest
3 голосов
/ 30 августа 2011

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

Пример определения таблицы:

CREATE TABLE `MyTable` (
  `id`  int NOT NULL ,
  `a`  varchar(10) NOT NULL ,
  `b`  varchar(10) NOT NULL , 
  `state`  tinyint NOT NULL , 
  PRIMARY KEY (`id`) 
) ;

Я бынравится обновлять «состояние» каждой строки, которые разделяют значения в том же столбце.Поэтому, если в первой строке указано «a = AAAA», а во второй строке указано одно и то же значение для «a», оба должны быть обновлены.

Я пробовал это, но это слишком медленно (не быстрее, чем в Java с использованием JDBC):

declare mycursor cursor for select id, a, b from mytable;
open mycursor;
repeat
   fetch mycursor into idid, aa, bb;
   update mytable set state=1 where (a=aa, b=bb)
until done end repeat;
close mycursor;

Есть идеи, как сделать этот путь лучше?Я не делал приличного SQL годами.

Ответы [ 4 ]

7 голосов
/ 30 августа 2011

Попробуйте первый запрос для просмотра строк с дубликатами -

SELECT * FROM MyTable t1
  JOIN (
    SELECT a, b FROM MyTable
      WHERE a = 'aa' AND b = 'bb' -- additional condition
      GROUP BY a, b
      HAVING COUNT(*) > 1) t2
  ON t1.a = t2.a AND t1.b = t2.b

Попробуйте этот (на основе первого запроса) обновить status поле -

UPDATE MyTable t1
JOIN (
  SELECT a, b FROM MyTable
  WHERE a = 'aa' AND b = 'bb' -- additional condition
  GROUP BY a, b
  HAVING COUNT(*) > 1) t2
ON t1.a = t2.a AND t1.b = t2.b
SET t1.state = 1;
3 голосов
/ 30 августа 2011

Ответ на мой вопрос выглядит следующим образом:

update mytable  as t1 inner join mytable as t2 on (t1.a=t2.a or t1.b = t2.b) and t1.id <> t2.id set t1.state=1;

Пожалуйста, скажите, если это не так (кажется, что это работает, но это может сделать странные вещи);)

0 голосов
/ 30 августа 2011

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

Если я неправильно понимаю вашувопрос и вам нужно пройти каждую запись таким образом, вы можете легко изменить курсор для простого цикла while, начиная с min (Id) и заканчивая max (Id).Цикл while должен работать намного быстрее, чем курсор.

0 голосов
/ 30 августа 2011

Попробуйте что-то вроде ...

update MyTable
set state = 1 
where id in (
select id 
from MyTable t1, MyTable t2 
where t1.id <> t2.id 
and t1.a = t2.a 
)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...