Tak*_*ku_ 14 sql oracle distinct
在我工作的地方我最近被告知在查询中使用distinct是一个程序员的坏迹象.所以我想知道我猜不使用此功能的唯一方法是使用group by.
我的理解是,除了阅读之外,distinct函数的工作方式与组相似.一个独特的函数检查每个单独的选择标准与一个组,通过该组,同一事物仅作为一个整体进行.
请记住,我只做报告.我不创建/更改数据.所以我的问题是我应该使用distinct或group by的最佳实践.如果两者都没有替代品.也许group by应该用在比我非实际例子更复杂的查询中,但是你明白了.我找不到真正解释为什么或为什么不在我的查询中使用distinct的答案
select distinct
spriden_user_id as "ID",
spriden_last_name as "last",
spriden_first_name as "first",
spriden_mi_name as "MI",
spraddr_street_line1 as "Street",
spraddr_street_line2 as "Street2",
spraddr_city as "city",
spraddr_stat_code as "State",
spraddr_zip as "zip"
from spriden, spraddr
where spriden_user_id = spraddr_id
and spraddr_mail_type = 'MA'
Run Code Online (Sandbox Code Playgroud)
VS
select
spriden_user_id as "ID",
spriden_last_name as "last",
spriden_first_name as "first",
spriden_mi_name as "MI",
spraddr_street_line1 as "Street",
spraddr_street_line2 as "Street2",
spraddr_city as "city",
spraddr_stat_code as "State",
spraddr_zip as "zip"
from spriden, spraddr
where spriden_user_id = spraddr_id
and spraddr_mail_type = 'MA'
group by "ID","last","first","MI","Street","Street2","city","State","zip"
Run Code Online (Sandbox Code Playgroud)
@zedfoxus提供的答案对于理解上下文很有用.
但是,如果数据设计正确,我不相信您的查询应该要求不同的记录.
您似乎正在选择表的主键spriden,因此所有数据都应该是唯一的.你也加入了spraddr桌子; 该表确实包含有效的重复数据吗?或者是否有一个额外的连接标准需要过滤掉那些重复项?
这就是我对使用" distinct" 感到紧张的原因- 该spraddr表可能包含您应该用来过滤数据的其他列,而" distinct"可能隐藏了这一点.
此外,您可能正在生成一个需要通过"distinct"子句进行过滤的大量结果集,这可能会导致性能问题.例如,如果spraddr每行有100万行,spriden则应使用"is_current"标志来查找2或3个"真实"行.
最后,当我看到"group by"用作替代品时,我感到紧张,不是因为它"错误",而是因为在风格上,我认为group by应该用于聚合函数.这只是个人偏好.
在你的例子中distinct,group by做同样的事情.我认为您的同事意味着您的查询不应该在第一个实例中返回重复项,并且您应该能够在没有distinctor group by子句的情况下编写查询.您可以通过扩展join条件来减少重复项.
问他们为什么这是一个不好的做法。许多人通过阅读本书的第一页或谷歌搜索的第一个结果来制定规则或提出他们认为不好的做法。如果它可以完成工作并且不会引起任何问题,那么就没有理由通过寻找替代方案来创造更多的工作。从您发布的两个选项中,我也会使用 distinct ,因为它更短且更易于阅读和维护。