Sql 在减号查询中指定列会产生与使用*

Sql 在减号查询中指定列会产生与使用*,sql,oracle,skip-take,Sql,Oracle,Skip Take,当我执行时 SELECT * FROM TABLE_NAME WHERE ROWNUM <= 20 MINUS SELECT * FROM TABLE_NAME WHERE ROWNUM <= 10 我拿到了一张唱片。一排 为什么会发生这种情况?如何解决此问题?您正在使用where rownum

当我执行时

SELECT * FROM TABLE_NAME WHERE ROWNUM <= 20 
MINUS 
SELECT * FROM TABLE_NAME WHERE ROWNUM <= 10 
我拿到了一张唱片。一排

为什么会发生这种情况?如何解决此问题?

您正在使用where rownum 因此,返回的行可以是表中的任意10行或20行。事实上,当您多次运行查询时,可能会得到不同的结果。当您在并行系统上运行查询时,这一点尤其明显——无论哪个线程碰巧获得数据,都可能首先返回数据,尽管对于简单的表扫描来说,这一点并不明显

你需要这样的东西:

(SELECT * FROM (SELECT * FROM TABLE_NAME ORDER BY COL1, COL2, COL3) WHERE ROWNUM <= 20)
MINUS 
(SELECT * FROM (SELECT * FROM TABLE_NAME ORDER BY COL1, COL2, COL3) WHERE ROWNUM <= 10) ;

集合操作并集、相交、减号始终删除重复项。联盟有表亲联盟都没有

使用减号时,无法避免删除重复项。如果您只关心前三列并希望保留重复项,则需要首先应用减号操作,然后才选择这三列

像这样:

SELECT COL1, COL2, COL3 FROM (
    SELECT * FROM TABLE_NAME WHERE ROWNUM <= 20 
    MINUS 
    SELECT * FROM TABLE_NAME WHERE ROWNUM <= 10
);

我觉得自己很傻,因为我没有马上想到这件事……:-

堆组织的表没有固有的顺序。您的查询没有顺序by so where rownum,因为您返回的是不同的数据,并且您正在删除两个集合中只有三列的重复记录。我看不到您的数据,但我假设您的表中有超过三列导致唯一性检查失败。三列上的结果与所有列上的结果不同,这有什么奇怪的呢?@Siyual嗨,Siyual,我也这么认为,如何禁用唯一性检查?@MatasVaitkevicius,不做减号?你想做什么?同一条记录排序,我想它会删除重复的行,就像@Siyual所说的。我理解你在这里试图通过对元组排序来做什么。。。但这不一定是这里的问题。这是减号命令和他如何使用它。减号将只返回第一个select中存在的集,而不是第二个select中存在的集。但仅使用3列并不能在记录上带来足够的唯一性。@dvsoukup。假设这10条记录是20条记录的子集。这是一个错误的假设。此外,OP没有指定表有多少列;它可能只有三列。此答案不正确,因为它假定第二个子查询将返回第一个子查询中的行子集。这是一个不正确的假设,除了在某些边缘情况下,例如表有20行或更少的行。@GordonLinoff我认为这是不对的。我理解你关于ROWNUM不稳定的观点。在这里不质疑OP的理由;但是:如果他不关心返回哪些行,那么我的查询实际上是正确的,因为一旦外部查询的处理开始,ROWNUM的设置就一成不变了。也就是说,减号运算的两个操作数中的ROWNUM实际上是相同的,即使它们可能在外部查询的不同执行时发生变化。
SELECT COL1, COL2, COL3 FROM (
    SELECT * FROM TABLE_NAME WHERE ROWNUM <= 20 
    MINUS 
    SELECT * FROM TABLE_NAME WHERE ROWNUM <= 10
);
WHERE ROWNUM BETWEEN 11 AND 20