Определить уникальные значения из оракула? - PullRequest
0 голосов
/ 30 августа 2018

Мне нужен способ избежать повторяющихся значений в oracle join, у меня такой сценарий.

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

+-----------+-------+-------------+
| 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 |EMAIL_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  |
| 899  | 4        | 2        |cvsd@www.es    |
+------+----------+----------+---------------+

Мне удалось получить такой результат, вы можете проверить по этой ссылке http://sqlfiddle.com/#!4/8e326/1

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

Если вы проверите данные в таблице Электронная почта для пользователя с ID_Person = 4, представьте только два из трех электронных писем, которые имеют, проблема для этого случая в том, что у человека есть больше электронных писем с номерами мобильных телефонов, и он будет представлять только тот же номер номера мобильных телефонов.

Результат, который я ожидал, примерно такой.

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

Это способ, которым мне нужно представить данные.

1 Ответ

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

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

select distinct p.id, p.name,
case when Lag(CELL) over(partition by p.id order by p.id,pe.id) = CELL then null else cell_type end as cell_type,
case when Lag(CELL) over(partition by p.id order by p.id,pe.id) = CELL then null else CELL end as CELL,
EMAIL_TYPE as EMAIL_TYPE, EMAIL as EMAIL
from person p full outer join phones pe on p.id = pe.id 
full outer join emails e
on p.id = e.id and pe.cell_type = e.email_type;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...