我有一个以下结构的SQL语句:
select distinct ...
from table1,
(select from table2, table3, table4 where ...)
where ...
order by ...
对于where子句中的某些值,该语句在结果集中返回零行。当我删除'distinct'关键字时,它会返回一行。我希望在这两种情况下都能看到一个结果行。是否有一些'distinct'关键字的属性我不知道并导致这种行为?
数据库是Oracle 11g。
答案 0 :(得分:4)
您描述的不是DISTINCT的预期行为。这是:
SQL> select * from dual
2 /
D
-
X
1 row selected.
SQL> select distinct * from dual
2 /
D
-
X
1 row selected.
SQL>
所以,如果你说的话真的发生了,那么这就是一个错误。但是,您也说这种情况很少发生,这意味着您的数据和/或环境中的瞬态条件很有可能存在某种特性,而不是错误。
出于两个原因,您需要创建可重现的测试用例。没有人,没有人能够调查你的问题。但主要是因为构建测试用例本身就是一项调查:尝试隔离数据和/或环境因素的精确组合通常会产生洞察力,从而产生解决方案。
答案 1 :(得分:1)
事实证明,其中一个子选择产生了一个数据集,其中包含一行,其中每列都为NULL。似乎这一行以非显而易见的方式影响了对DISTINCT的评估(至少对我而言)。也许这是由于一些引擎不足的SQL优化。在我删除了这个填充NULL的行的原因之后,问题就消失了,语句在结果中评估为一行。