Создать уникальный идентификатор, который НЕ равен NULL в представлении Oracle с помощью LEFT JOIN?

У меня есть две таблицы, foo и bar, которые связаны друг с другом отношением "один ко многим":

CREATE TABLE foo (
  id NUMBER PRIMARY KEY
);

CREATE TABLE bar (
  id NUMBER PRIMARY KEY,
  foo NUMBER NOT NULL,
  CONSTRAINT fk_bar_foo FOREIGN KEY (foo) REFERENCES foo (id)
);

Теперь я хочу создать представление с LEFT JOIN между двумя таблицами, где каждая строка в представлении имеет уникальный id, поэтому я попробовал это:

CREATE OR REPLACE my_view AS
SELECT ORA_HASH(foo.id || '~' || bar.id) id
FROM foo
LEFT JOIN bar ON bar.foo = foo.id

Моя проблема в том, что столбец id представления становится нулевым, хотя он никогда не может иметь значение NULL. Чтобы это работало с другим приложением, мне нужно иметь уникальный ненулевой идентификатор в представлении.

Могу ли я как-то обмануть Oracle, чтобы сделать столбец необнуляемым? Или есть другой способ создать уникальный идентификатор, который не может быть нулевым?


person Anders    schedule 07.12.2015    source источник
comment
См. stackoverflow.com/questions/11097839/   -  person Tony Andrews    schedule 07.12.2015
comment
Я думаю, вы можете сделать это с материализованным представлением, но не с обычным представлением.   -  person Gordon Linoff    schedule 07.12.2015


Ответы (1)


Как насчет того, чтобы вместо создания идентификатора из идентификаторов двух существующих таблиц создать его на основе sys_guid()? Что-то вроде:

CREATE OR REPLACE view my_view AS
SELECT sys_guid() id
FROM foo
LEFT JOIN bar ON bar.foo = foo.id
person Jodevan    schedule 07.12.2015
comment
Столбец по-прежнему имеет значение NULL. - person Gordon Linoff; 07.12.2015
comment
У вас есть образец ваших данных? Я не могу получить эти нулевые значения. Честно говоря, даже используя вашу функцию, я не смог получить нулевые значения. - person Jodevan; 07.12.2015
comment
@ Джован . . . создайте таблицу как create table t as select * from my_view, и вы увидите значения NULL. - person Gordon Linoff; 08.12.2015
comment
Все равно не могу воспроизвести. Я запустил ваше утверждение, и оно сработало как шарм :-/ - person Jodevan; 08.12.2015
comment
Спасибо за ответ! К сожалению, я также получаю столбец с нулевым значением на 12c. - person Anders; 08.12.2015
comment
О, теперь я понимаю, что вы имеете в виду. У вас есть Oracle 12. У меня есть Oracle 11. Возможно, это проблема вашей конкретной версии. - person Jodevan; 08.12.2015
comment
@ Джодеван . . . Очень интересно. Я удивлен, что изменился с Oracle 11 на 12. Могу сказать, что даже установка ограничения первичного ключа для столбца в представлении не решила проблему в Oracle 11. - person Gordon Linoff; 09.12.2015