Как удалить дубликаты записей

Запрос:

Select table_c.id_number, table_c.name, table_s.site_name,table_co.Contract_name 
FROM table_c , table_s, table_m, table_o, table_a, table_con 
  WHERE 
   table_s.objid = table_c.sobjid
   AND table_m.cobjid (+) = table_c.objid 
   AND table_o.objid (+) = table_m.olobjid   
   AND table_a.objid (+) = table_o.aobjid 
   AND table_co.objid (+) = table_a.conobjid;

Здесь у меня есть 6 таблиц. table_c и table_s имеют отношения один к одному. Возможно, что для 1 записи table_o у нас может быть 2 записи table_c или может не быть записи. Так как мне нужно взять значения table_co в SELECT вместе с таблицами table_c и table_s, я использовал обойденное соединение для всех таблиц table_c->table_m->table_o->table_a->table_co.

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

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

Обратите внимание, что этот запрос является частью представления SQL, используется внешними системами для получения данных.

Заранее спасибо.

1 ответ

Попробуйте использовать ROW_NUMBER():

SELECT * FROM (
    Select table_c.id_number, table_c.name, table_s.site_name,table_co.Contract_name ,
           ROW_NUMBER() OVER(PARTITION BY table_c.id_number,table_c.name ORDER BY 1) as rnk
    FROM table_c 
    INNER JOIN table_s ON(table_s.objid = table_c.sobjid)
    LEFT OUTER JOIN table_m ON(table_m.cobjid = table_c.objid )
    LEFT OUTER JOIN table_o ON(table_o.objid = table_m.olobjid)
    LEFT OUTER JOIN table_a ON(table_a.objid = table_o.aobjid )
    LEFT OUTER JOIN table_con ON(table_co.objid = table_a.conobjid))
WHERE rnk = 1;

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

я использовал PARTITION BY table_c.id_number,table_c.name, добавьте все столбцы, укажите "уникальную" строку.

Другие вопросы по тегам