为什么此语句会合并表和虚拟表中的RowID?

时间:2019-03-21 22:02:06

标签: sql oracle oracle11g

我正在努力将Camel和myBatis的应用程序升级到Spring boot和Jooq。

在我们的应用程序的merge语句的using函数中嵌套了一个非常奇怪的sql语句。我不明白此声明的目的,无论写谁的人都不再在公司任职。

在合并的使用部分内,它实际上就像

Select A, B, C, D FROM (
    Select ROWID as RID, A, B, C, D FROM TableA TA WHERE A = var
    UNION ALL
    Select ROWID, null, null, null, null FROM dual
WHERE ROWID >= 1 

在所有match语句中均未使用ROWID,因此对我而言根本没有意义。尽管我对合并语句一无所知。

编辑:Using's On条件是为了确保A等于var,因为var是通过触发sql的函数发送的变量。基本上只是ON A = var

2 个答案:

答案 0 :(得分:0)

在最后一行中使用RowID。 (WHERE ROWID> = 1)。

为了使UNION ALL正常工作,列数必须相同。

对于您的问题,它取决于获取查询后的程序逻辑。既然我们在这里可以看到两个表是合并的。

例如,TableA的ROWID为1,2,3,而“双”表的ROWID为1,2,3。结果(合并表)将显示1,1,2,2,3,3。

了解程序处理结果的重要性更重要,因为您可以找出为什么旧语句执行UNION ALL的原因。

答案 1 :(得分:0)

作者可能想保证查询将至少返回一行。 (或恰好是一行)

如果

Select ROWID as RID, A, B, C, D FROM TableA TA WHERE A = var

不返回任何内容(零行,未找到任何内容),然后UNION ALL将附加NULL行并将其返回。

我对Oracle不熟悉,因此我不确定WHERE ROWID >= 1的成就。 也许是为了保证结果集始终只有一行。