Самостоятельное объединение без двойного набора результатов? - PullRequest
1 голос
/ 07 сентября 2011

Существует несколько дублирующих (появляющихся дважды или более) комбинаций (id, name, dept_name).Примечание: имя dept_name имеет значение NULL, поэтому в этом столбце часто встречаются пустые значения.

Я пытаюсь получить результат комбинирования дубликатов (id, name, dept_name), в котором одна запись имеет нулевой mgr_id или salно другая запись того же дублированного комбо имеет ненулевой mgr_id или sal.

Это то, что у меня есть:

 select t1.id, t1.name, t1.dept_name, t1.mgr_id, t2.mgr_id, t1.sal, t2.sal from employee t1
    inner join employee t2 on t2.id = t1.id and t2.name = t1.name
    where t1.id in
    (select id from 
    (select id, name, dept_name, count(*) from employee
    group by id, name, dept_name
    having count(*) > 1))
    and (nvl(t1.mgr_id,0) <> nvl(t2.mgr_id,0) 
    or nvl(t1.sal,0) <> nvl(t2.sal,0)) 
    and t1.mgr_id is not null ;

Если я не покину последнюю строку "и t1.mgr_id не является нулевым "в запросе, я фактически получаю один и тот же набор результатов дважды (что мне не нужно).Однако мне нужен какой-то способ включения предложения (t1.sal is not null), чтобы не получить один и тот же набор результатов дважды.

Кроме того, обратите внимание, что нет столбца PK или порядкового номера, куда я могу просто перейти: t1.seq_no <> t2.seq_no.

Ответы [ 5 ]

2 голосов
/ 07 сентября 2011

Разве вы не можете просто добавить фильтр в операционную систему?:

 select t1.id, t1.name, t1.dept_name, t1.mgr_id, t2.mgr_id, t1.sal, t2.sal from employee t1
    inner join employee t2 on t2.id = t1.id and t2.name = t1.name
    where t1.id in
    (select id from 
    (select id, name, dept_name, count(*) from employee
    group by id, name, dept_name
    having count(*) > 1))
    and ((nvl(t1.mgr_id,0) <> nvl(t2.mgr_id,0) AND t1.mgr_id is not null) 
    or (nvl(t1.sal,0) <> nvl(t2.sal,0) AND t1.sal is not null));
1 голос
/ 09 сентября 2011

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

http://tsells.wordpress.com/2010/01/08/sql-query-trick-to-find-duplicate-records/

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

select 
t1.ID,
t1.MyName,
t2.MyName,
t2.ID
from
Table t1 
inner join Table t2 on t1.MyName = t2.MyName and t1.ID <> t2.ID

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

1 голос
/ 07 сентября 2011

Это потому, что у вас есть 4 ситуации.

  • sal null, dept null

  • sal null, dept nonnull

  • sal nonnull, dept null

  • sal nonnull, dept nonnul

И у вас есть только два набора столбцов длясравните.

Каким-то образом вы получите дубликаты.

В качестве гибрида вы можете попробовать:

select distinct t1.id, t1.name, t1.dept_name, t1.mgr_id, t2.mgr_id, t1.sal, t2.sal from employee t1
    inner join employee t2 on t2.id = t1.id and t2.name = t1.name
    where t1.id in
    (select id from 
    (select id, name, dept_name, count(*) from employee
    group by id, name, dept_name
    having count(*) > 1))
    and (nvl(t1.mgr_id,0) <> nvl(t2.mgr_id,0) 
    or nvl(t1.sal,0) <> nvl(t2.sal,0)) ;

(обратите внимание на отличное)

или, вы можете использовать:

select distinct t1.id, t1.name, t1.dept_name, t1.mgr_id 
from employee t1
order by 1, 2, 3, 4

, и вы увидите разницу между строками.

1 голос
/ 07 сентября 2011

Попробуйте, если это работает ...

select id,name,dept_name 
from employee 
where id in (select a.id 
             from employee a 
             where (a.sal is NULL or a.mgr_id is NULL) 
and a.id in (select b.id 
             from employee b 
             where b.sal is not NULL or b.mgr_id is not NULL));
1 голос
/ 07 сентября 2011

Вы можете использовать ROWID для различения строк:

and t1.ROWID <> t2.ROWID
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...