【问题标题】:How to use ROWID with an Oracle Join View如何在 Oracle 联接视图中使用 ROWID
【发布时间】:2011-12-07 14:15:35
【问题描述】:

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

进行谷歌搜索看起来我可以通过使用 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

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

谢谢!

【问题讨论】:

    标签: oracle view uniqueidentifier rowid


    【解决方案1】:

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

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

    【讨论】:

    • 知道了,我连接了一堆主键来实现我想要的。谢谢!
    【解决方案2】:

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

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

    【讨论】:

    • 我碰巧有其他表的主键,但很高兴知道这一点。谢谢!
    【解决方案3】:

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

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

    【讨论】:

      【解决方案4】:

      这个问题现在已经回答了一段时间,但在连接主键时请小心。 例如,当您有 key1 = 23 and key2 = 45 并将其连接到 2345 时,不清楚键是 23 and 45 还是它们是2 and 345

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

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

      【讨论】:

        【解决方案5】:

        不推荐使用ROWID,但是如果你在JOIN或者where条件下强制使用,则必须使用ROWIDTOCHAR函数 例如:ROWIDTOCHAR(ROWID) = key

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

        【讨论】:

          猜你喜欢
          • 2013-02-18
          • 1970-01-01
          • 2019-01-17
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-12-18
          • 1970-01-01
          相关资源
          最近更新 更多