在这种情况下,我需要一种避免来自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 |
+-----+-------+-------------+----------+----------+----------+----------------+
这是我需要呈现数据的方式。
答案 0 :(得分:1)
我不明白为什么您的查询如此复杂,因此添加了简单的完全外部联接,它似乎可以正常工作:
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;