2015-06-16 2 views
0
Table:  
firstname | lastname | age  
Joey  | Sanchez | 33 
Joey  | Sanchez | 33 
Rachel  | Dudok  | 28 

Я пытаюсь сделать отборное заявление MySQL, который возвращает значение «ERROR» в столбце возраста, когда 2 колонок являются дубликатамиВозврата на основе дублированных столбцов

Я попытался саз, но он заканчивается только возвратом 1 строки.

SELECT 
Firstname, 
Lastname, 
CASE 
    WHEN count(firstname) AND count(lastname) AND count(age) >= 2 
    THEN '**ERROR**' 
    ELSE age 
END 
FROM Table; 
+0

очистить ваши данные , Подумайте, что у вас может быть 2 20-летнего john doe's – AsConfused

ответ

1

Вы можете попробовать с group by:

select Firstname 
     , Lastname 
     , case when count(*) > 1 then '**ERROR**' else age end 
from Table 
group by Firstname 
     , Lastname 
     , age; 

Или в случае, если вы хотите, чтобы вернуть все строки с дубликатами:

select t.Firstname 
     , t.Lastname 
     , case when (select count(*) 
        from Table 
        where Firstname = t.Firstname and 
         Lastname = t.Lastname and 
         age = t.age) > 1 then '**ERROR**' else age 
     end 
from Table t 
+0

. Это заканчивается тем, что удаляет 1 строку, есть ли способ вернуть все 3 строки, но только, чтобы в столбце age отображалось значение «ERROR»? – bennyharassi

+0

@bennyharassi: обновлено – potashin

0

Есть много способов, чтобы иметь дело с повторяющимися записями. Возможно, лучший способ для большинства ситуаций, чтобы предотвратить их полностью используя уникальные ключи:

ALTER TABLE `mytable` ADD UNIQUE INDEX (`firstname`,`lastname`,`age`); 

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

SELECT s.`firstname`,s.`lastname`,IF(c.rc > 1,'ERROR',s.`age`) AS 'age' 
     FROM `myTable` AS s 
     JOIN (SELECT `firstname`, `lastname`, `age`, count(*) AS rc 
       FROM `myTable` 
      GROUP BY `firstname`,`lastname`,`age`) 
     AS c ON c.`firstname` = s.`firstname` 
      AND c.`lastname` = s.`lastname` 
      AND c.`age` = s.`age`; 

Если вы хотите только получить 1 строку для каждой комбинации имя/возраст, добавить DISTINCT к внешнему запросу:

SELECT DISTINCT s.`firstname`,s.`lastname`,IF(c.rc > 1,'ERROR',s.`age`) AS 'age' 
     FROM `myTable` AS s 
     JOIN (SELECT `firstname`, `lastname`, `age`, count(*) AS rc 
       FROM `myTable` 
      GROUP BY `firstname`,`lastname`,`age`) 
     AS c ON c.`firstname` = s.`firstname` 
      AND c.`lastname` = s.`lastname` 
      AND c.`age` = s.`age`; 
Смежные вопросы