2015-08-31 3 views
0

Oracle SQL: Как найти и удалить дубликатыOracle SQL: Поиск и удаление дубликатов (одинаковое значение в разных столбцах)

У меня есть только доступ только для чтения к Oracle (Можно использовать только SELECT, команды).

Logic: Два пользователя 'A' & 'В', имеющие такое же имя компании & Имя

Колонки для извлечения:

ID of A 
ID of B 
Company Name of A 
Company Name of B 
First Name of A 
First Name of B 

Я использую ниже запроса:

select a.id, b.id, a.name, b.name, a.company, b.company from 
(select id, company, name where country = 'USA') a, 
(select id, company, name where country = 'UK') b 
where a.id <> b.id 
and lower(a.company) = lower(b.company) 
and a.username = b.username 

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

A_ID .......... B_ID .......... A_NAME .... ...... B_NAME .......... A_COMPANY .......... B_COMPANY

3592382 .... 1977967 .... Peter ...... .......... Питер ................. ABC ..................... A.B.C.

1977967 .... 3592382 .... Peter ................ Peter ................. A.B.C. ..................... A.B.C.

5949363 .... 5941818 .... Joseph ............ Joseph .............. X.Y.Z. ..................... X.Y.Z.

5941818 .... 5949363 .... Joseph ............ Joseph .............. X.Y.Z. ..................... X.Y.Z.

+0

Другие упомянули несколько что-то не так с вашим синтаксисом, но я вижу более фундаментальную проблему. Почему американские и британские компании считаются дублирующими, когда они имеют одно и то же имя? –

ответ

0

У вас есть пара вопросов с запросом.

1) Если вы делаете select val1,val2 from a, b, вы получите результат cross-join.

2) В таблицах с псевдонимом нет предложения from.

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

select distinct a.id, b.id, a.name, b.name, a.company, b.company 
from 
(select id, company, name from tablename where country = 'USA') a 
join 
(select id, company, name from tablename where country = 'UK') b 
on a.id = b.id and lower(a.company) = lower(b.company) and a.username = b.username 
0

Вы забыли имена таблиц в подзапросах. Также я рекомендую не получать a.col и b.col, если оба значения будут одинаковыми (это условие), так как это снижает производительность и не добавляет каких-либо ценных данных.

SELECT a.id, b.id, a.name, a.company 
FROM tablename a 
JOIN tablename b 
    ON (a.name == b.name AND a.company == b.company AND a.username == b.username) 
WHERE a.country = 'USA' 
    AND b.country = 'UK'