Oracle запрос исключить дубликаты, не считая Null - PullRequest
0 голосов
/ 19 марта 2019

Я выполнил полное внешнее объединение, где я получаю следующее:

ColumnFromTable1          ColumnFromTable2
     AAA                       ABA
     AAA                       Null          <-  remove
     AAA                       ACC
     BBB                       Null
     CCC                       CDC
     Null                      EFE
     DDD                       FFF
     Null                      FFF           <-  remove
     GGG                       FFF

Что я действительно хочу, так это раздавить строки, чтобы удалить дубликаты, чтобы мои результаты были:

ColumnFromTable1          ColumnFromTable2
     AAA                       ABA
     AAA                       ACC
     BBB                       Null
     CCC                       CDC
     Null                      EFE
     DDD                       FFF
     GGG                       FFF

В основном мне нужно исключить

AAA  Null
Null  FFF

, поскольку у меня есть AAA или FFF с ненулевым значением.Но мне нужно сохранить

BBB  Null
Null  EFE

, потому что нет BBB или EFE с ненулевым

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

РЕДАКТИРОВАТЬ вот упрощенный запрос для этого поста

select ColumnFromTable1, ColumnFromTable2 from Table1 t1
       full outer join Table2 t2 on t1.common_code = t2.common_code 
       group by ColumnFromTable1, ColumnFromTable2 

Ответы [ 2 ]

3 голосов
/ 19 марта 2019

row_number() выглядит многообещающе:

select c1, c2
  from (
    select c1, c2, 
           row_number() over (partition by c1 order by c2) r1,
           row_number() over (partition by c2 order by c1) r2
      from t)
  where not ((c1 is null and r2 > 1) or (c2 is null and r1 > 1))

демо

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

0 голосов
/ 19 марта 2019

Поместив полное внешнее объединение, которое вы уже вычислили в CTE, вы можете отфильтровать его дальше, как вы хотите, выполнив:

with f (c1, c2) as (
  ... -- full outer join you already computed here
)
a (x) as ( -- repeated c1 with non-null c2
  select c1
  from f
  group by c1
  having count(c2) > 0
),
b (x) as ( -- repeated c2 with non-null c1
  select c2
  from f
  group by c2
  having count(c1) > 0
)
select *
from f
where not(c1 in (select x from a) and c2 is null)
  and not(c2 in (select x from b) and c1 is null)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...