如何在同一个表上创建具有多个连接的视图

Posted

技术标签:

【中文标题】如何在同一个表上创建具有多个连接的视图【英文标题】:How to create view with multiple joins on same table 【发布时间】:2015-10-29 15:12:43 【问题描述】:

在我的数据库中,我有这两个表:

人物

+----+---------+---------+
| pk |  name   | sirname |
+----+---------+---------+
|  1 | john    | leno    |
|  2 | william | wallice |
|  3 | eva     | apple   |
|  4 | walter  | white   |
+----+---------+---------+

请求

+----+-------------+----------+---------------+---------+---------+
| pk | requestdate | accepted | requestperson | parent1 | parent2 |
+----+-------------+----------+---------------+---------+---------+
|  1 | 1/1/2014    | Y        |             1 | 2       | 3       |
|  2 | 1/2/2014    | N        |             4 | NULL    | NULL    |
+----+-------------+----------+---------------+---------+---------+

为了得到我所做的请求:

SELECT * 
FROM request
LEFT JOIN person p_subject ON requestperson = p_subject.pk
LEFT JOIN person p_parent1 ON parent1 = p_parent1.pk
LEFT JOIN person p_parent2 ON parent2 = p_parent2.pk

这很完美,但是当我想创建一个视图时:

CREATE VIEW v_request AS
SELECT * 
FROM request
LEFT JOIN person p_subject ON requestperson = p_subject.pk
LEFT JOIN person p_parent1 ON parent1 = p_parent1.pk
LEFT JOIN person p_parent2 ON parent2 = p_parent2.pk

我收到此错误:ORA-00957: duplicate column name

我不想手动重命名所有列。我该如何解决这个问题?

【问题讨论】:

CREATE VIEW v_request (cname1, cname2, ... ) AS 是最简单的方法。 您肯定需要在某处列出列名;几乎没有办法解决这个问题。 我认为重命名视图中的列会比写下问题花费更少的时间......只是说。你为什么不想重命名它们呢?否则,您如何引用正确连接中的值? (即哪个 sirname 列是父姓与主题 sirname?) 【参考方案1】:

您的视图将包括:

三列,列名pk 三列,列名name(这不是一个好的列名) 三列,列名sirname

因为表格别名不会自动添加(错误ORA-00957: duplicate column name 准确说明)

我很确定您必须手动将它们重命名为 subject_pksubject_namesubject_sirname 等等。

【讨论】:

以上是关于如何在同一个表上创建具有多个连接的视图的主要内容,如果未能解决你的问题,请参考以下文章

在同一个表上具有多个连接的 Oracle 复杂查询

如何在大表上优化这个 mysql 连接?

查看在表上具有自联接

用于在不同表上具有多个 LEFT OUTER JOINS 的 SQL 的 LINQ

创建具有多个对象/层的视图 [关闭]

如何在视图上实现聚集索引