Oracle - как выполнить левое соединение с представлениями?

Как создать представление с помощью левого соединения в Oracle?

Я могу создать таблицу соединений, используя этот оператор

select * from concert_copy c left join event_copy e on c.concert_id=e.concert_id;

Но когда я создаю представления с помощью этого оператора, возникает ошибка "ORA-00957: повторяющееся имя столбца".

create view concert_event as select * from concert_copy c left join event_copy e on c.concert_id=e.concert_id;

person flyingduck92    schedule 30.12.2017    source источник


Ответы (2)


По крайней мере столбец concert_id присутствует в обеих таблицах. SELECT * приведет к тому, что представление будет иметь 2 столбца с одинаковыми именами. Решение: указать поля явно хотя бы для одной из таблиц

create view concert_event as
    select c.*, e.eventname, ...
    from
        concert_copy c
        left join event_copy e
            on c.concert_id = e.concert_id;

Если есть другие повторяющиеся имена, используйте псевдонимы. Например. Если в обеих таблицах есть столбец name

select c.*, e.name as eventname, ...

Примечание: если вы вызываете SELECT напрямую, Oracle автоматически создает общие имена для повторяющихся столбцов и выражений, но в представлениях требуется, чтобы все имена столбцов были видны из объявления, либо потому, что они совпадают с именем выбранного столбца, либо потому, что псевдоним дано.

person Olivier Jacot-Descombes    schedule 30.12.2017

Не используйте звездочку (например, SELECT *), а назовите ВСЕ выбранные вами столбцы, дав каждому из них отличительное имя. Например, если и CONCERT_COPY, и EVENT_COPY имеют столбец с именем ID, вам придется

select c.id concert_id, e.id event_id, ...
from concert_copy c left join event_copy e ...
person Littlefoot    schedule 30.12.2017
comment
о, я не могу использовать звездочку? Данг, я этого не знаю. Спасибо @Littlefoot - person flyingduck92; 30.12.2017
comment
Вы можете, но это ОБЫЧНО плохая идея. Лучше назвать все столбцы, особенно если вы пишете код, который будет использоваться в продакшене. Кто-то, кому может понадобиться поддерживать ваш код, будет точно знать, что вы выбрали. SELECT подходит для *быстрых и грязных выборок, но, как видите, может вызвать проблемы. - person Littlefoot; 30.12.2017
comment
возможно ли обновить эти столбцы в представлении? почему я не могу обновить каждый столбец в представлении? - person flyingduck92; 30.12.2017
comment
Обновлять? Да, а также вставить или удалить. Обычно это делается с помощью вместо триггеров. Дополнительная информация здесь: docs.oracle.com/cd/ B10501_01/сервер.920/a96524/ - person Littlefoot; 30.12.2017
comment