SQL(PLSQL),如何选择不同但计数> 1
Posted
技术标签:
【中文标题】SQL(PLSQL),如何选择不同但计数> 1【英文标题】:SQL (PLSQL), how to select distinct but with count > 1 【发布时间】:2018-12-01 15:32:35 【问题描述】:我有一个表 INVOICE
与 ID_STUFF, STUFF_NAME, E_MAIL
列。我需要找到 ID_STUFF 相同但 STUFF_NAME 或 E_MAIL 不同的行。
select distinct g.id_stuff, g.staff_name, g.e_mail from invoice g
显示:
但是对于相同的ID_STUFF
,我不需要具有相同值的行。
【问题讨论】:
根据您向我们展示的样本数据,您的预期输出是什么? @TimBiegeleisen 我需要屏幕截图中的输出,但没有 id_stuff = 1, 4, 6 的行,因为它们的计数是 1 【参考方案1】:大概,您想要原始行。如果是这样,我建议使用exists
两次:
select i.*
from invoice i
where exists (select 1
from invoice i2
where i2.id_stuff = i.id_stuff and
i2.staff_name <> i.staff_name
) or
exists (select 1
from invoice i2
where i2.id_stuff = i.id_stuff and
i2.e_mail <> i.e_mail
) ;
该查询可以利用invoice(id_stuff, e_mail)
和invoice(id_stuff, staff_name)
上的索引——这将在大型表上获得巨大的性能提升。
如果您只想要id_stuff
,那么group by
是一个很好的解决方案。您可以使用listagg()
获取姓名和电子邮件列表:
select i.id_stuff,
listagg(e_mail, ',') within group (order by e_mail),
listagg(staff_name, ',') within group (order by staff_name)
from invoice i
group by i.id_stuff
having min(e_mail) <> max(e_email) or
min(staff_name) <> max(staff_name);
【讨论】:
非常感谢!【参考方案2】:使用exists
查找相似记录:
select g.id_stuff, g.staff_name, g.e_mail from invoice g
where exists
(select 1 from invoice g1 where g1.id_stuff =g.id_stuff
and ( g1.staff_name <> g.staff_name or g1.e_mail <> g.e_mail)
【讨论】:
以上是关于SQL(PLSQL),如何选择不同但计数> 1的主要内容,如果未能解决你的问题,请参考以下文章