【发布时间】:2016-11-02 18:16:23
【问题描述】:
当我执行时
SELECT * FROM TABLE_NAME WHERE ROWNUM <= 20
MINUS
SELECT * FROM TABLE_NAME WHERE ROWNUM <= 10
我得到SKIP 10 TAKE 10(十行)的预期结果
但如果我明确指定列
SELECT COL1, COL2, COL3 FROM TABLE_NAME WHERE ROWNUM <= 20
MINUS
SELECT COL1, COL2, COL3 FROM TABLE_NAME WHERE ROWNUM <= 10
我得到了单条记录。 (一排)
为什么会这样?我该如何解决这个问题?
【问题讨论】:
-
堆组织的表没有内在的顺序。您的查询没有
order by,因此where rownum <= 20返回任意20 行,rownum <= 10返回任意10 行。您可以轻松地再次运行相同的查询获得不同的结果。您可能会从执行表扫描的第一个查询和使用索引的第二个查询得到不同的结果,但这只是猜测。如果您想要一组稳定的结果,则需要指定确定性顺序。根据 Oracle 版本,可能还有更简单的构造。 -
因为您要返回不同的数据,并且您要删除仅包含三列的两组的重复记录。我看不到您的数据,但我假设您的表中有超过三列导致唯一性检查失败。
-
三列上的结果与所有列上的结果不同,这有什么令人惊讶的?
-
@Siyual Hi Siyual,我也这么认为,如何禁用唯一检查?
-
@MatasVaitkevicius 不做
MINUS?你想做什么?