【问题标题】:How to solve ERROR 1060: Duplicate column name using Views -> Create View如何解决 ERROR 1060: Duplicate column name using Views -> Create View
【发布时间】:2016-11-18 22:38:59
【问题描述】:

我正在尝试通过从 Sakila 数据库 (https://dev.mysql.com/doc/sakila/en/) 加入一些表(在 MySQL 中)来创建一个视图,即我想加入付款、员工和客户并显示客户姓名、员工姓名、付款 ID和金额。 我右键单击视图,然后单击创建表。 我认为存在此错误是因为在员工表和客户表中都有名为 first_name 和 last_name 的列。我该如何解决这个问题?

我的代码:

CREATE VIEW `payment` AS
SELECT payment.payment_id, customer.first_name, customer.last_name, 
staff.first_name, staff.last_name, payment.amount
FROM payment INNER JOIN customer ON payment.customer_ID = customer.customer_ID
INNER JOIN staff ON payment.staff_ID = staff.staff_ID

错误信息: 错误 1060:重复的列名 'first_name'

如果我按照一些回答者的建议尝试使用别名,我会收到错误 ERROR 1347: 'sakila.payment' is not VIEW。

完全相同的代码就像 SQL 文件中的魅力一样,当我运行它时,它会创建我需要的表。这两种方法有什么区别?我应该使用哪一个?为什么它不能与 Views -> Create View 选项一起使用?

提前谢谢你。

【问题讨论】:

  • 您不会收到此处显示的联接发布的错误,因为您已通过从客户表中定义所需的 first_name 列来定义它。也许在您的实际连接中您没有指定表格。
  • 尝试 SELECT payment.payment_id, customer.first_name as customer_firstname, customer.last_name as customer_last_name ...等等...换句话说,为相同的列名添加别名...跨度>
  • @Niagaradad,我确实在实际连接中指定了表

标签: mysql sql view


【解决方案1】:

使用别名来分配名称:

CREATE VIEW v_payment AS
    SELECT p.payment_id, c.first_name as customer_first_name, c.last_name as customer_last_name,
           s.first_name as staff_first_name, s.last_name as staff_last_name,
           p.amount
    FROM payment p INNER JOIN
         customer c
         ON p.customer_ID = c.customer_ID INNER JOIN
         staff s
         ON p.staff_ID = s.staff_ID;

first_namelast_name 在您的 select 列表中出现两次。以上澄清了该名称是针对客户还是员工。

【讨论】:

  • 现在我收到一条错误消息 ERROR 1347: 'sakila.payment' is not VIEW。我已经尝试在 SELECT 语句中使用 AS,但它不起作用,我当时也遇到了这个确切的错误。
  • @LillaNagy 。 . .我错过了您试图为视图提供与表相同的名称。视图必须有不同的名称。为此,我经常在它们前面加上v_
  • 没关系,我忘了说这个,我几分钟前才编辑的。谢谢,我试试看。
【解决方案2】:

限制是列名必须是唯一的。

SELECT 查询可能有效,但它确实返回具有相同名称的列。两列名为first_name,两列名为last_name

当我们将查询用作视图(内联视图或存储视图)时会出现错误。

解决方法是通过提供列别名来重命名列,这样结果集中没有两列具有相同的名称。例如:

SELECT payment.payment_id
     , customer.first_name   AS customer_first_name
     , customer.last_name    AS customer_last_name
     , staff.first_name      AS staff_first_name
     , staff.last_name       AS staff_last_name
     , payment.amount
  FROM payment 
  JOIN customer
    ON ...
  JOIN staff
    ON ...

【讨论】:

    猜你喜欢
    • 2020-02-27
    • 2021-11-03
    • 2014-03-19
    • 1970-01-01
    • 1970-01-01
    • 2017-09-05
    • 2021-12-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多