Как удалить повторяющиеся значения из оракула соединения? - PullRequest
0 голосов
/ 29 августа 2018

Я хочу создать представление, которое представляет только результаты и не отображает дубликаты. У меня есть 3 таблицы в базе данных Oracle:

Первая таблица содержит общую информацию о человеке

+-----------+-------+-------------+
| ID        | Name  | Birtday_date|
+-----------+-------+-------------+
| 1         | Byron | 12/10/1998  |
| 2         | Peter | 01/11/1973  |
| 4         | Jose  | 05/02/2008  |
+-----------+-------+-------------+

Вторая таблица содержит информацию о телефоне людей из первой таблицы.

+-------+----------+----------+----------+
| ID    |ID_Person |CELL_TYPE | NUMBER   |
+-------+- --------+----------+----------+
| 1221  | 1        | 3        | 099141021|
| 2221  | 1        | 2        | 099091925|
| 3222  | 1        | 1        | 098041013|
| 4321  | 2        | 1        | 088043153|
| 4561  | 2        | 2        | 090044313|
| 5678  | 4        | 1        | 092049013|
| 8990  | 4        | 2        | 098090233|
+----- -+----------+----------+----------+

Третья таблица содержит информацию об электронной почте людей из первой таблицы.

+------+----------+----------+---------------+
| ID   |ID_Person |MAIL_TYPE | Email         |
+------+- --------+----------+---------------+
| 221  | 1        | 1        |jdoe@aol.com   |
| 222  | 1        | 2        |jdoe1@aol.com  |
| 421  | 2        | 1        |xx12@yahoo.com |
| 451  | 2        | 2        |dsdsa@gmail.com|
| 578  | 4        | 1        |sasaw1@sdas.com|
| 899  | 4        | 2        |cvcvsd@wew.es  |
+------+----------+----------+---------------+

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

+-----+-------+-------------+----------+----------+----------+----------------+
| ID  | Name  | Birtday_date| CELL_TYPE|  NUMBER  |MAIL_TYPE|Email            |
+-----+-------+-------------+----------+----------+----------+----------------+
| 1   | Byron | 12/10/1998  | 3        | 099141021|1         |jdoe@aol.com    |   
| 1   | Byron | 12/10/1998  | 3        | 099141021|2         |jdoe1@aol.com   |  
| 1   | Byron | 12/10/1998  | 2        | 099091925|1         |jdoe@aol.com    | 
| 1   | Byron | 12/10/1998  | 2        | 099091925|2         |jdoe1@aol.com   | 
| 1   | Byron | 12/10/1998  | 1        | 098041013|1         |jdoe@aol.com    | 
| 1   | Byron | 12/10/1998  | 1        | 098041013|2         |jdoe1@aol.com   |
| 2   | Peter | 01/11/1973  | 1        | 088043153|1         |xx12@yahoo.com  |
| 2   | Peter | 01/11/1973  | 1        | 088043153|2         |dsdsa@gmail.com |
| 2   | Peter | 01/11/1973  | 2        | 090044313|1         |xx12@yahoo.com  |
| 2   | Peter | 01/11/1973  | 2        | 090044313|2         |dsdsa@gmail.com |
| 4   | Jose  | 05/02/2008  | 1        | 088043153|1         |sasaw1@sdas.com |
| 4   | Jose  | 05/02/2008  | 1        | 088043153|2         |cvcvsd@wew.es   |
| 4   | Jose  | 05/02/2008  | 2        | 088043153|1         |sasaw1@sdas.com |
| 4   | Jose  | 05/02/2008  | 2        | 088043153|2         |cvcvsd@wew.es   |
+-----+-------+-------------+----------+----------+----------+----------------+

Таким образом, результат, который я хочу представить в виде, следующий

+-----+-------+-------------+----------+----------+----------+----------------+
| ID  | Name  | Birtday_date| CELL_TYPE|  NUMBER  |MAIL_TYPE|Email            |
+-----+-------+-------------+----------+----------+----------+----------------+
| 1   | Byron | 12/10/1998  | 3        | 099141021|1         |jdoe@aol.com    |   
| 1   | Byron | 12/10/1998  |          |          |2         |jdoe1@aol.com   |  
| 1   | Byron | 12/10/1998  | 2        | 099091925|          |                | 
| 1   | Byron | 12/10/1998  | 1        | 098041013|          |                | 
| 2   | Peter | 01/11/1973  | 1        | 088043153|1         |xx12@yahoo.com  |
| 2   | Peter | 01/11/1973  |          |          |2         |dsdsa@gmail.com |
| 2   | Peter | 01/11/1973  | 2        | 090044313|          |                |
| 4   | Jose  | 05/02/2008  | 1        | 092049013|1         |sasaw1@sdas.com |
| 4   | Jose  | 05/02/2008  |          |          |2         |cvcvsd@wew.es   |
| 4   | Jose  | 05/02/2008  | 2        | 098090233|          |                |
+-----+-------+-------------+----------+----------+----------+----------------+

Я пытался добиться аналогичного результата, используя

case
  when row_number() over (partition by table1.id order by table2.type) = 1
  then table1.value
 end
   as "VALUE"

Но я ничего не ожидаю, и некоторые строки повторяются

Ответы [ 2 ]

0 голосов
/ 29 августа 2018

Надеюсь, это поможет.

Create table person(ID int ,Name varchar(20), Birtday_date date)
Insert into person values
(1,'Byron' ,'12/10/1998'),
(2,'Peter' ,'01/11/1973'),
(4,'Jose ' ,'05/02/2008')


Create table phones (ID int,ID_Person int,CELL_TYPE int,NUMBER float)
Insert into phones values
(1221, 1 , 3,099141021),
(2221, 1 , 2,099091925),
(3222, 1 , 1,098041013),
(4321, 2 , 1,088043153),
(4561, 2 , 2,090044313),
(5678, 4 , 1,092049013),
(8990, 4 , 2,098090233)


Create table emails(ID int,ID_Person int, MAIL_TYPE int, Email varchar(100))
Insert into emails values
(221, 1 , 1, 'jdoe@aol.com   '),
(222, 1 , 2, 'jdoe1@aol.com  '),
(421, 2 , 1, 'xx12@yahoo.com '),
(451, 2 , 2, 'dsdsa@gmail.com'),
(578, 4 , 1, 'sasaw1@sdas.com'),
(899, 4 , 2, 'cvcvsd@wew.es  ')

select p.id, p.name, p.Birtday_date,
       case when Lag(number) over(partition by p.id order by p.id,pe.id) = number then null else cell_type end as cell_type,
       case when Lag(number) over(partition by p.id order by p.id,pe.id) = number then null else number end as number,
       mail_type as mail_type, email as email
from person p left join
     (select pp.ID_Person, cell_type, number, mail_type, email,pp.id from
     (select ID_Person, cell_type, number,id,
              row_number() over (partition by ID_Person order by id ) as seqnum
       from phones 
      ) pp left join
      (select ID_Person,
              mail_type, email, 1 as seqnum
       from emails 
      )e on pp.ID_Person = e.ID_Person and pp.seqnum = e.seqnum
     ) pe
on pe.ID_Person = p.Id
order by  p.id, pe.id
0 голосов
/ 29 августа 2018

Что вам нужно сделать, это перечислить строки и затем присоединиться к этим перечислениям. Это сложно, потому что вы не знаете, сколько в каждом списке. Ну, есть еще один метод, использующий условное агрегирование:

select p.id, p.name, p.birthday,
       max(cell_type) as cell_type, max(number) as number,
       max(mail_type) as mail_type, max(email) as email
from person p left join
     ((select id_person, cell_type, number,
              null as mail_type, null as email,
              row_number() over (partition by id_person order by number) as seqnum
       from phones
      ) union all
      (select id_person, null as cell_type, null as number,
              mail_type, email,
              row_number() over (partition by id_person order by email) as seqnum
       from emails
      )
     ) pe
     on pe.id_person = p.id_person
group by p.id, p.name, p.birthday, pe.seqnum
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...