Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/73.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 我应该在查询中使用distinct吗_Sql_Oracle_Distinct - Fatal编程技术网

Sql 我应该在查询中使用distinct吗

Sql 我应该在查询中使用distinct吗,sql,oracle,distinct,Sql,Oracle,Distinct,在我工作的地方,最近有人告诉我,在查询中使用distinct是程序员的坏迹象。所以我想知道我猜唯一不使用此功能的方法是使用分组方式 我的理解是,distinct函数的工作原理与group by非常相似,只是它的读取方式不同。一个独特的函数将检查每个单独的选择标准,而不是只作为一个整体执行相同操作的组 请记住,我只做报告。我不创建/更改数据。所以我的问题是,我应该使用distinct还是group by的最佳实践。如果两者都没有,那么就没有替代方案了。也许GROUPBY应该用在比我这里的非真实示例

在我工作的地方,最近有人告诉我,在查询中使用distinct是程序员的坏迹象。所以我想知道我猜唯一不使用此功能的方法是使用分组方式

我的理解是,distinct函数的工作原理与group by非常相似,只是它的读取方式不同。一个独特的函数将检查每个单独的选择标准,而不是只作为一个整体执行相同操作的组

请记住,我只做报告。我不创建/更改数据。所以我的问题是,我应该使用distinct还是group by的最佳实践。如果两者都没有,那么就没有替代方案了。也许GROUPBY应该用在比我这里的非真实示例更复杂的查询中,但是你明白了。我找不到一个能真正解释为什么或者为什么我不应该在我的查询中使用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'
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"     

数据库很聪明,可以识别你的意思。我希望您的两个查询都能同样出色地执行。维护您的查询的其他人了解您的意思很重要。如果确实要检索不同的记录,请使用
distinct
。如果您打算进行聚合,请使用
groupby


看一看。有一些很好的答案可能会有所帮助。

在您的示例中,
distinct
groupby
做同样的事情。我认为您的同事的意思是,您的查询首先不应该返回重复的查询,并且您应该能够在不使用
distinct
group by
子句的情况下编写查询。您可以通过扩展您的
加入条件来减少重复项。

询问他们为什么这是一种不好的做法。很多人会根据阅读本书的第一页或谷歌搜索的第一个结果来制定规则或想出一些他们认为不好的事情。如果它完成了任务并且没有引起任何问题,那么就没有理由通过寻找替代方案来创造更多的工作。从您发布的两个选项中,我也会使用distinct,因为它较短,更易于阅读和维护。

由@zedfoxus提供的答案有助于理解上下文

但是,如果数据设计正确,我不认为您的查询应该需要不同的记录

看起来您正在选择table
spriden
的主键,因此所有数据都应该是唯一的。您还加入了
spraddr
表;该表真的包含有效的重复数据吗?或者,是否需要一个额外的连接标准来过滤掉这些重复项

这就是为什么我对使用“
distinct
”感到紧张的原因,
spraddr
表可能包含您应该用来过滤数据的附加列,而“
distinct
”可能正在隐藏这些列

此外,您可能会生成大量的结果集,需要使用“distinct”子句进行过滤,这可能会导致性能问题。例如,如果
spraddr
中每行
spriden
中有100万行,您应该使用“is_current”标志查找2或3个“real”行


最后,当我看到“groupby”被用作distinct的替代品时,我感到紧张,不是因为它“错了”,而是因为从风格上来说,我认为groupby应该用于聚合函数。这只是个人偏好。

如果您的查询是正确的、不同的,并且分组方式提供相同的结果集,但是您的同事正确地指出不同的结果隐藏了问题。如果您丢失了一个连接并使用了一个GROUP BY,您将获得比预期更多的信息。如果缺少联接并使用DISTINCT,SQL引擎将执行无界(或部分有界)联接,请缩小结果范围,然后得出预期的答案

除了生成的数据量超出所需量会导致性能明显下降之外,您还可能会面临填充tempdb的风险(即:tempdb所在的硬盘空间不足)


在生产中使用GROUP BY。

任何人告诉你使用
DISTINCT
本身就是一个错误的标志。实际上,这完全取决于您首先使用
DISTINCT
试图解决的问题

如果您查询的表预期具有某些字段或字段组合的重复值,并且您正在报告一个值或值组合列表(并且没有对其执行任何聚合),那么使用
DISTINCT
是最明智的。在我看来,仅仅因为有人认为不应该使用
DISTINCT
而使用
groupby
是没有意义的。事实上,我认为这是
独特的
设计的目的

如果您发现您的查询有一个bug,意味着返回了重复的值,那么您不应该使用
DISTINCT
groupby
来消除这个bug。相反,您应该找出错误的原因并修复它


使用
DISTINCT
作为安全网也是一种糟糕的做法,因为它可能隐藏问题,而且计算成本可能会很高(通常为O(n logn)或O(n2))。在这种情况下,我看不出使用
分组方式对您有什么帮助。

是的,当我在别人的查询中遇到Distinct时,Distinct会在我的脑海中引起一点警觉。当然,在某些情况下需要它,但大多数数据模型不应该需要它。它往往是不得不使用它的最后手段,或异常情况。它还可能是系统性的错误应用程序位于数据库的顶部,允许插入重复条目或将重复条目更新为重复条目(同样,没有相应的数据库级别约束来阻止此类操作)。所以首先要检查的是数据。这可能是一个信号