Как выполнить самостоятельное соединение на большом столе - PullRequest
1 голос
/ 24 июня 2019

У меня очень большая таблица (~ 70 миллионов строк), в которой столбец id получен из другой таблицы. Идентификатор был назначен неправильно. 2 разных человека с разными именами получили одинаковый идентификатор, а им не следовало назначать его. Теоретически я понимаю, что самообъединение в одной и той же таблице, где идентификатор одинаков и первый не равен, должно работать, но с большим количеством строк запрос застрял. Любые идеи относительно того, как я могу продолжить?

Я пытался отфильтровать некоторые данные и скопировал содержимое в совершенно новую таблицу, но безрезультатно.

Мой код выглядит так

select distinct m1.first_name, m.first_name, m1.id from member m inner join member_1 m1 on m.id = m1.id and m.first_name <> m1.first_name

Данные выглядят так

run_id  first_name      id 
1       aaaa            1 
2       aaaa            1 
3       aaaa            1 
3       bbbb            2 
3       cccc            3 
4       aaaa            1 
4       bbbb            4 
5       bbbb            4 
5       cccc            3 
6       aaaa            1 
6       bbbb            4 
6       cccc            3 

В этом случае, если вы заметили, в run_id 2 bbbb был назначен идентификатор 2, а в сериях 5 и 6 bbbb был назначен идентификатор 4. В этом случае bbbb, по-видимому, был назначен 2 идентификатора. Как мне только отфильтровывать такие строки, а не тянуть аааа и cccc. Использование различных ресурсов истощает мои ресурсы и, по-видимому, не является хорошим вариантом

Ответы [ 2 ]

2 голосов
/ 24 июня 2019

Вместо самостоятельного объединения используйте group by с having и count distinct:

SELECT first_name
FROM member 
GROUP BY first_name
HAVING COUNT(DISTINCT Id) > 1

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

Вы можете повысить производительность, добавив индекс для first_name и id, если он все еще работает слишком медленно.

1 голос
/ 24 июня 2019

Я бы предложил использовать exists:

select m.*
from member_1 m
where exists (select 1
              from member_1 m2
              where m2.id = m.id and m2.first_name <> m.first_name
             );

Затем для производительности вам нужен индекс для member_1(id, first_name).

Если вам просто нужны идентификаторы, вы можете использовать агрегацию:

select id
from member_1
group by id
having min(first_name) <> max(first_name);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...