【问题标题】:In SQL, 'distinct' reduces the number of result rows from one to zero在 SQL 中,'distinct' 将结果行数从 1 减少到 0
【发布时间】:2011-01-28 00:26:18
【问题描述】:

我有一个如下结构的 SQL 语句:

select distinct ...
from table1,
(select from table2, table3, table4 where ...)
where ...
order by ...

对于 where 子句中的某些值,该语句在结果集中返回零行。当我删除 'distinct' 关键字时,它会返回一行。我希望在这两种情况下都看到一个结果行。是否存在我不知道的“distinct”关键字的某些属性并导致此行为?

数据库是Oracle 11g。

【问题讨论】:

  • 你有这个选择的 DDL 和 DML 吗?
  • 你不能建立一个我们可以实际尝试的例子吗?
  • 感谢您的快速回复!如果我可以在论坛上发布声明,我将需要等待几个小时才能清除。至于 DDL 和 DML,这可能是一种非常罕见的情况,所以我怀疑我可以构造一个人工的例子。

标签: sql oracle


【解决方案1】:

您所描述的不是 DISTINCT 的预期行为。这是:

SQL> select * from dual
  2  /

D
-
X

1 row selected.

SQL> select distinct * from dual
  2  /

D
-
X

1 row selected.

SQL>

所以,如果你所说的确实是正在发生的事情,那么它就是一个错误。但是,您还说这是一种罕见的情况,这意味着它很可能是您的数据和/或环境中的瞬态条件的某些特殊性,而不是错误。

出于两个原因,您需要创建一个可重现的测试用例。在某种程度上,没有一个人将无法调查您的问题。但主要是因为构建测试用例本身就是一项调查:尝试隔离数据和/或环境因素的精确组合通常会产生导致解决方案的洞察力。

【讨论】:

  • 感谢您的建议。下次我会提供一个更好的例子。
【解决方案2】:

事实证明,其中一个子选择产生了一个数据集,其中包含一行,其中每一列都是 NULL。似乎这一行以一种不明显的方式影响了对 DISTINCT 的评估(至少对我而言)。也许这是由于一些底层 SQL 优化。在我删除了这个填充了 NULL 的行的原因后,问题就消失了,该语句在结果中计算为应有的一行。

【讨论】:

  • 建议您接受自己的答案。而且它看起来确实像一个错误,所以如果其他人遇到同样的问题,数据库版本可能会有用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-07
相关资源
最近更新 更多