Ошибка столбец указан неоднократно postgresql

СЦЕНАРИЙ:

У меня есть оператор select, который JOIN представляет собой несколько таблиц вместе:

SELECT 
    e0.id, e0.name, e0.slug,
    e1.id, e1.edition, e1.url, e1.date, e1.event_id,
    v2.id, v2.title, v2.language, v2.description, v2.provider, v2.videoid, v2.image_url, v2.event_id, v2.edition_id,
    s3.id, s3.name, s3.twitter, s3.website
FROM 
    events AS e0 
LEFT OUTER JOIN 
    editions AS e1 ON e1.event_id = e0.id
LEFT OUTER JOIN 
    videos AS v2 ON v2.edition_id = e1.id
LEFT OUTER JOIN 
    videos_speakers AS v4 ON v4.video_id = v2.id
LEFT OUTER JOIN 
    speakers AS s3 ON v4.speaker_id = s3.id
ORDER BY 
    e1.date DESC;

Я хотел бы создать представление Postgres. Итак, выписал это так:

CREATE VIEW all_events 
AS
    SELECT 
        e0.id, e0.name, e0.slug,
        e1.id, e1.edition, e1.url, e1.date, e1.event_id,
        v2.id, v2.title, v2.language, v2.description, v2.provider, v2.videoid, v2.image_url, v2.event_id, v2.edition_id,
        s3.id, s3.name, s3.twitter, s3.website
    FROM 
        events AS e0 
    LEFT OUTER JOIN 
        editions AS e1 ON e1.event_id = e0.id
    LEFT OUTER JOIN 
        videos AS v2 ON v2.edition_id = e1.id
    LEFT OUTER JOIN 
        videos_speakers AS v4 ON v4.video_id = v2.id
    LEFT OUTER JOIN 
        speakers AS s3 ON v4.speaker_id = s3.id
    ORDER BY 
        e1.date DESC;

Я получаю эту ошибку:

ОШИБКА: столбец «id» указан более одного раза

ВОПРОСЫ:

  1. Как я могу исправить эту ошибку? Я хотел бы создать представление под названием «all_events».
  2. Являются ли Postgres View похожими псевдонимами на других языках?

Новичок в Postgres, читая документы, но пытаясь понять ментальную модель Вот.

2 ответа

У вас есть несколько одинаковых имен столбцов. Даже если вы выберете e0.id, столбец все еще будет иметь имя (только) id.

Но в области просмотра (или таблицы) имя каждого столбца должно быть уникальным.

Вам необходимо предоставить псевдонимы для каждого дублирующегося столбца:

CREATE VIEW all_events AS
SELECT  e0.id as event_id, --<< here 
        e0.name as event_name, --<< here 
        e0.slug,
        e1.id as edition_id,  --<< here
        e1.edition, 
        e1.url, 
        e1.date, 
        e1.event_id as edition_event_id, --<< here
        v2.id as video_id,  --<< here
        v2.title, 
        v2.language, 
        v2.description, 
        v2.provider, 
        v2.videoid, 
        v2.image_url, 
        v2.event_id as video_event_id, --<< here 
        v2.edition_id as video_edition_id, --<< here
        s3.id as speaker_id,  --<< here
        s3.name as speaker_name, --<< here 
        s3.twitter, 
        s3.website
FROM events AS e0 
  LEFT OUTER JOIN editions AS e1 ON e1.event_id = e0.id
  LEFT OUTER JOIN videos AS v2 ON v2.edition_id = e1.id
  LEFT OUTER JOIN videos_speakers AS v4 ON v4.video_id = v2.id
  LEFT OUTER JOIN speakers AS s3 ON v4.speaker_id = s3.id;

Хотя Postgres позволяет это, я настоятельно рекомендую не создавать представление с помощью оператора ORDER BY. Если вы когда-либо сортируете результаты этого представления по другому столбцу, Postgres отсортирует данные дважды.


3

a_horse_with_no_name
10 Дек 2019 в 20:23

В представлении столбцы по умолчанию называются так же, как столбцы запроса. Ошибка возникает из-за того, что столбец с именем id определен во всех трех объединенных таблицах. Вам нужно предоставить псевдонимы для дифференциации сталкивающихся столбцов, например:

CREATE VIEW all_events AS
SELECT e0.id as e0id, e0.name as e0name, e0.slug,
        e1.id as e1id, e1.edition, e1.url, e1.date, e1.event_id,
        v2.id as e2id, v2.title, v2.language, v2.description, v2.provider, v2.videoid, v2.image_url, v2.event_id, v2.edition_id,
        s3.id as s3id, s3.name as s3name, s3.twitter, s3.website
        FROM events AS e0 
        LEFT OUTER JOIN editions AS e1 ON e1.event_id = e0.id
        LEFT OUTER JOIN videos AS v2 ON v2.edition_id = e1.id
        LEFT OUTER JOIN videos_speakers AS v4 ON v4.video_id = v2.id
        LEFT OUTER JOIN speakers AS s3 ON v4.speaker_id = s3.id
        ORDER BY e1.date DESC;


1

Andronicus
10 Дек 2019 в 20:07

Запрос работает, а вот при создании представления пишет «столбец «car_number» указан неоднократно»
select * from done_cars inner join works on done_cars.car_number=works.car_number where works.number=( select number from works group by number order by count(number) desc limit 1);


  • Вопрос задан

    более года назад

  • 340 просмотров

car_number у тебя дублируется — done_cars.car_number и works.car_number

при создании вьюхи укажи явно, из какой таблицы брать поля

Пригласить эксперта


  • Показать ещё
    Загружается…

06 июн. 2023, в 08:55

2000 руб./за проект

06 июн. 2023, в 08:29

3600000 руб./за проект

06 июн. 2023, в 07:46

1000 руб./за проект

Минуточку внимания

You are not selecting columns, you are selecting string constants in your view. And the string constants don’t have names, so Postgres names them «?column?«.

I strongly assume you don’t actually want to have the string value 'users.createdAt' in your view, but the actual content of the respective table column. You need to remove the single quotes for that.

As you have multiple columns (createdat, updatedat) with the same name, you need to give them a proper alias:

CREATE VIEW v_users AS
SELECT 
    users.user_id,
    users.full_name,
    users.username,
    users.password,
    roles.role_name,
    roles.role_id,
    users.roles_id,
    users.createdAt as user_created_at,
    users.updatedAt as user_updated_at,
    roles.createdAt as roles_created_at,
    roles.updatedAt as roles_updated_at
FROM users
  INNER JOIN roles
   ON users.roles_id = roles.role_id;

С вызовом PostgreSQL,

CREATE TABLE condor_xrootd AS
SELECT * FROM condor INNER JOIN xrootd_ext
ON (
xrootd_ext.CRAB_Id = condor.CRAB_Id AND
REPLACE(condor.CRAB_ReqName, '_', ':') = xrootd_ext.CRAB_ReqName
);

Я получаю ошибку,

$ psql condor -f ./sql/inner_join.sql 
psql:./sql/inner_join.sql:6: ERROR: column "crab_id" specified more than once

Это понятно, потому что каждая таблица имеет столбец Crab_Id. Я хотел бы иметь возможность сделать свое внутреннее соединение, не указывая столбцы, потому что у меня около четырехсот столбцов в двух таблицах.

Пожалуйста, дайте мне знать, могу ли я как-то избавиться от этой ошибки, не указывая столбцы отдельно.

РЕДАКТИРОВАТЬ:

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

Вы не выбираете столбцы, вы выбираете строковые константы в своем представлении. И строковые константы не имеют имен, поэтому Постгрес называет их «?column?«.

Я твердо предполагаю, что вы на самом деле не хотите иметь строковое значение 'users.createdAt'на ваш взгляд, но фактическое содержимое соответствующего столбца таблицы. Для этого вам нужно удалить одинарные кавычки.

Поскольку у вас есть несколько столбцов (createdat, updatedat) с тем же именем, вам нужно дать им правильный псевдоним:

CREATE VIEW v_users AS
SELECT 
    users.user_id,
    users.full_name,
    users.username,
    users.password,
    roles.role_name,
    roles.role_id,
    users.roles_id,
    users.createdAt as user_created_at,
    users.updatedAt as user_updated_at,
    roles.createdAt as roles_created_at,
    roles.updatedAt as roles_updated_at
FROM users
  INNER JOIN roles
   ON users.roles_id = roles.role_id;

Понравилась статья? Поделить с друзьями:
  • Ошибка столбец не существует postgresql
  • Ошибка стойки syntec
  • Ошибка стоит дорого
  • Ошибка срс мерседес 220
  • Ошибка срс мерседес 210