Sql 如何从oracle join中删除重复值?
我想创建一个只显示结果而不显示重复项的视图,oracle数据库中有3个表: 第一个表包含有关个人的一般信息Sql 如何从oracle join中删除重复值?,sql,oracle,oracle11g,inner-join,Sql,Oracle,Oracle11g,Inner Join,我想创建一个只显示结果而不显示重复项的视图,oracle数据库中有3个表: 第一个表包含有关个人的一般信息 +-----------+-------+-------------+ | ID | Name | Birtday_date| +-----------+-------+-------------+ | 1 | Byron | 12/10/1998 | | 2 | Peter | 01/11/1973 | | 4 | Jo
+-----------+-------+-------------+
| 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 |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"
但是结果并不是我所期望的,有些行会重复您需要做的是枚举这些行,然后在这些枚举上进行连接。这很棘手,因为您不知道每个列表中有多少。还有另一种使用条件聚合的方法:
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
希望这有帮助
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
对两个表表达式使用左外联接,每个表表达式使用row_number()。