SQL(PLSQL),如何选择不同但计数> 1

Posted

技术标签:

【中文标题】SQL(PLSQL),如何选择不同但计数> 1【英文标题】:SQL (PLSQL), how to select distinct but with count > 1 【发布时间】:2018-12-01 15:32:35 【问题描述】:

我有一个表 INVOICEID_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的主要内容,如果未能解决你的问题,请参考以下文章

如何禁止oracle采用科学计数法

如何查询历史sql

plsql如何执行.sql文件?

进入PLSQL的命令窗口,输入SQL语句后,应该如何执行?

PLSQL执行SQL脚本文件「适用批量」- 工具使用篇

plsql怎么导出csv