我正在尝试为视图的每一行创建唯一标识符。我加入了很多表的视图,因此没有一个表的主键可以帮助我识别行。
进行谷歌搜索看起来我可以通过使用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
我试图在查询中而不是存储过程中执行此操作。任何帮助,将不胜感激!
谢谢!
答案 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