Выбор идентификаторов таблицы, где 3 или более столбца являются дубликатами - PullRequest
1 голос
/ 03 мая 2020

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

Select * From Workers

+----+--------+--------+--------------+
| id | name   |JobTitle| description  |    
+----+--------+--------+--------------+    
| 1  | john   |Plumber |Installs Pipes|    
| 2  | mike   | Doctor |Provides Meds |   
| 3  | john   |Plumber |Installs Pipes|    
| 4  | john   |Plumber |Installs Pipes|    
| 5  | mike   | Doctor |Provides Meds |    
| 6  | mike   | Doctor |Provides Meds |   
+----+--------+--------+--------------+

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

SELECT t1.id 
From workers t1, workers t2
Where t1.id > t2.Id and t1.name = t2.name and t1.jobTitle = t2.jobTitle and t1.description = t2.description;

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

Код ошибки: 1054. Неизвестный столбец 't1.userId' в 'предложении where'

Я пытался увеличить время ожидания в рабочей среде, но безрезультатно. В этом примере я в основном пытаюсь получить все идентификаторы, кроме 1 и 2. Я думал, что приведенный выше запрос даст мне то, что я искал, но это не так, и теперь я не уверен, что еще можно попробовать.

Любая помощь с благодарностью. Заранее спасибо.

Ответы [ 2 ]

1 голос
/ 03 мая 2020

Вы можете сделать это с 'INNER JOIN

SELECT DISTINCT t1.*
From workers t1
INNER JOIN workers t2 ON t1.name = t2.name and t1.jobTitle = t2.jobTitle and t1.description = t2.description
Where t1.id > t2.Id ;

Но я не могу понять, как вы получили ваше сообщение, в поле зрения пользователя нет

1 голос
/ 03 мая 2020

Сообщение об ошибке не соответствует вашему запросу (в запросе нет столбца userId) - и оно не связано с размером таблицы.

В любом случае, я бы отфильтровал с помощью exists:

select w.*
from workers w
where exists (
    select 1
    from workers w1
    where
        w1.name = w.name
        and w1.jobTitle = w.jobTitle
        and w1.description = w.description
        and w1.id < w.id
)

Для производительности рассмотрите индекс на (name, jobTitle, description, id).

...