2

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

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

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

谢谢!

4

5 回答 5

6

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

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

于 2011-12-07T14:27:34.997 回答
4

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

SELECT rt.rowid||v1.rowid||v2.rowid as uniqueid
FROM ......
于 2011-12-07T14:51:30.713 回答
1

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

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

于 2013-12-10T02:06:54.803 回答
0

这个问题现在已经回答了一段时间,但是在连接主键时请小心。例如,当您拥有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 的特性(不是所有的数据库都可以处理这个)在多个列上定义主键和外键,这可能会更快,并扩展干净连接的可能性,而不必拆分连接的键。

于 2014-10-13T11:31:51.367 回答
0

不建议使用 ROWID,但如果你JOIN在 where 或 where 条件下被迫使用它,你必须使用ROWIDTOCHAR函数 Ex:ROWIDTOCHAR(ROWID) = key

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

于 2020-06-23T16:51:52.330 回答