如何在Oracle Join View中使用ROWID

时间:2011-12-07 14:15:36

标签: oracle view uniqueidentifier rowid

我正在尝试为视图的每一行创建唯一标识符。我加入了很多表的视图,因此没有一个表的主键可以帮助我识别行。

进行谷歌搜索看起来我可以通过使用rowid实现这一目标?但我不确定如何引用视图的rowid。下面是我想象的rowid如何工作的一个例子,但它明显失败了一个'模糊列'错误,因为我没有为rowid指定一个特定的表。

例如:


    with v_someTable (select...),
      v_anotherTable as (select blah, id from v_someTable where...),
      v_yetAnotherTable as (select foo, id from v_someTable where...)
    select distinct rowid, rt.key, v1.blah, v2.foo
    from realTable rt 
      left join v_anotherTable v1 on v1.id=rt.id 
      left join v_yetAnotherTable v2 on v2.id=rt.id

我试图在查询中而不是存储过程中执行此操作。任何帮助,将不胜感激!

谢谢!

5 个答案:

答案 0 :(得分:5)

我的理解是rowid指的是物理表中的一行,而不是结果集中的一行(实际上是一个视图)。

要获取每行的唯一标识符,您需要以某种方式组合要加入的表的主键。

答案 1 :(得分:3)

如果您的所有表上没有主键,则可以从各个表中选择rowid并将它们连接起来:

SELECT rt.rowid||v1.rowid||v2.rowid as uniqueid
FROM ......

答案 2 :(得分:1)

不要使用ROWID伪列,它是存储依赖的(并且在使用有用的ENABLE ROW MOVEMENT时可能会更改)。您也不能使用它以有效的方式在视图上查找(加入)记录。

在这种情况下,最好在记录中使用真正的PK(使索引查找起作用)。我不会加入它们,只是使用多个列 - 只有这样你才能重新选择它们(有索引支持)。

答案 3 :(得分:0)

这个问题现在已经回答了一段时间,但在合并主键时请小心。 例如,当您有 key1 = 23 and key2 = 45 并将其汇总到 2345 时,目前尚不清楚密钥是否为 23 and 45 < / strong>或者如果他们 2 and 345

使用任何键中不会出现的分隔符 (23,45 -> 23_45) (并非所有键都是数字键)。或者将密钥填充到最大可能长度 (23,45 -> 00230045 (for key1 and key2 NUMBER(4,0)))

还要注意Oracles功能(并非所有数据库都可以处理此问题)在多列上定义主键和外键,这可能更快,并且可以扩展清洁连接的可能性,而无需拆分连接键。

答案 4 :(得分:0)

不建议使用ROWID,但是如果您被迫在JOIN或某些条件下使用它,则必须使用ROWIDTOCHAR函数 例如:ROWIDTOCHAR(ROWID) = key

注意:ROWIDTOCHAR函数用于将ROWID转换为其等效的VARCHAR2值 从Oracle 12c开始可以使用ROWIDTOCHAR