Как использовать ROWID с Oracle Join View - PullRequest
2 голосов
/ 07 декабря 2011

Я пытаюсь создать уникальный идентификатор для каждой строки представления. Имеющееся у меня представление объединяет множество таблиц, поэтому первичный ключ одной таблицы не поможет мне определить строку.

При поиске в Google похоже, что я могу достичь этого с помощью rowid? Но я не уверен, как ссылаться на rowid представления. Ниже приведен пример того, как я предполагал, что будет работать rowid, но он, очевидно, завершается с ошибкой «неоднозначный столбец», поскольку я не указываю конкретную таблицу для rowid.

Ex:


    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 ]

6 голосов
/ 07 декабря 2011

Насколько я понимаю, rowid относится к строке в физической таблице, а не к строке в наборе результатов (что фактически является представлением).

Чтобы получить уникальный идентификатор дляв каждой строке вам нужно каким-то образом комбинировать первичные ключи таблиц, к которым вы присоединяетесь.

3 голосов
/ 07 декабря 2011

Если у вас нет первичных первичных ключей во всех ваших таблицах, вы можете выбрать значения строк из отдельных таблиц и объединить их:

SELECT rt.rowid||v1.rowid||v2.rowid as uniqueid
FROM ......
1 голос
/ 10 декабря 2013

Не используйте псевдостолбец ROWID, это зависит от хранилища (и может измениться при использовании usefull ENABLE ROW MOVEMENT). Вы также не можете использовать его для эффективного поиска (объединения) записей в представлении.

В этом случае лучше использовать настоящие PK в ваших записях (для поиска индексов для работы). И я бы не стал к ним присоединяться, а просто использовал несколько столбцов - только так вы можете выбрать их заново (с поддержкой индекса).

0 голосов
/ 13 октября 2014

Ответ на этот вопрос уже есть, но будьте осторожны при объединении первичных ключей. Например, если у вас есть 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 (не все БД могут это обрабатывать), позволяющей определять первичные и внешние ключи для нескольких столбцов, которые могут быть быстрее и расширять ваши возможности для чистых объединений без разделения вашего связанного ключа.

...