Creating Postgres View getting ERROR: column "id" specified more than once
Creating Postgres View getting ERROR: column "id" specified more than once
情景:
我有这个 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 View。所以写成这样:
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;
我不断收到此错误:
ERROR: column "id" specified more than once
问题:
- 如何修复此错误?我想创建一个名为 "all_events" 的视图。
- Postgres View 有点像其他语言中的别名吗?
Postgres 新手,阅读 docs 但试图理解此处的心智模型。
在视图中,列的名称默认与查询的列相同。发生错误,因为在所有 3 个连接表中都定义了名为 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;
您有几个相同的列名。即使您 select e0.id
该列仍然是名称(仅)id
。
但是在视图范围内(或table)每个列名必须是唯一的。
您需要为每个重复的列提供别名:
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 将对数据进行两次排序。
情景:
我有这个 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 View。所以写成这样:
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;
我不断收到此错误:
ERROR: column "id" specified more than once
问题:
- 如何修复此错误?我想创建一个名为 "all_events" 的视图。
- Postgres View 有点像其他语言中的别名吗?
Postgres 新手,阅读 docs 但试图理解此处的心智模型。
在视图中,列的名称默认与查询的列相同。发生错误,因为在所有 3 个连接表中都定义了名为 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;
您有几个相同的列名。即使您 select e0.id
该列仍然是名称(仅)id
。
但是在视图范围内(或table)每个列名必须是唯一的。
您需要为每个重复的列提供别名:
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 将对数据进行两次排序。