2015-12-07 1 views
1

У меня есть две таблицы, foo и bar, которые связаны друг с другом с один-ко-многим отношения:Создать уникальный идентификатор, который не является NULL в представлении Oracle с LEFT JOIN?

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, чтобы сделать столбец нецелевым? Или существует какой-то другой способ генерации уникального идентификатора, который не является нулевым?

+0

См http://stackoverflow.com/questions/11097839/how-to-create-a-not-null-column-in-a-view –

+0

Я думаю, что вы можете сделать это с материализованный вид, но не с обычным видом. –

ответ

1

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

CREATE OR REPLACE view my_view AS 
SELECT sys_guid() id 
FROM foo 
LEFT JOIN bar ON bar.foo = foo.id 
+0

Столбец по-прежнему недействителен. –

+0

У вас есть образец ваших данных? Я не могу получить эти нулевые значения. Чтобы быть откровенным, даже используя вашу функцию, я не мог получить никаких нулевых значений. – Jodevan

+0

@Joevan. , , создайте таблицу как 'create table t as select * from my_view', и вы увидите значения NULL. –

Смежные вопросы