如何在Oracle Join视图中使用ROWID
-
29-10-2019 - |
题
我正在尝试为视图的每一行创建一个唯一的标识符。我拥有的视图连接了很多表,因此没有一个表的主键可以帮助我识别行。
在Google搜索中看起来可以通过使用rowid来实现此目的吗?但是我不确定如何引用视图的rowid。以下是我设想的rowid如何工作的示例,但是由于我没有为rowid指定特定的表,因此它显然会失败并显示“歧义列”错误。
例如: 通用标签
我正在尝试在查询而不是存储过程中执行此操作。任何帮助,将不胜感激!
谢谢!
解决方案
我的理解是,rowid
指的是物理表中的一行,而不是结果集中的一行(实际上是视图)。
要获取每一行的唯一标识符,您需要以某种方式组合要连接的表的主键。
其他提示
如果在所有表上都没有主主键,则可以从各个表中选择行ID并将它们连接起来: 通用标签
不要使用ROWID伪列,它是存储依赖项(使用有用的ENABLE ROW MOVEMENT
时可能会改变)。您也不能使用它以有效的方式在视图上查找(合并)记录。
在这种情况下,最好在记录上使用真实的PK(以使索引查找有效)。而且我不会加入它们,而只是使用多列-只有这样,您才能重新选择它们(具有索引支持)。
这个问题现在已经回答了一段时间,但是在添加主键时请小心。
例如,当您具有 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的功能(并非所有DB都可以处理),可以在多个列上定义主键和外键,这可能会更快,并且无需拆分隐式键即可扩展纯联接的可能性。