2016-11-18 100 views
-2

我想创建一个视图从Sakila数据库(https://dev.mysql.com/doc/sakila/en/)加入一些表(在MySQL中),即我想加入支付,员工和客户并显示客户名称,员工姓名,付款ID和金额。 我右键单击视图,然后创建表。 我认为这个错误是存在的,因为在staff表和customer表中都有名为first_name和last_name的列。我怎么能解决这个问题?如何解决错误1060:重复列名使用视图 - >创建视图

我的代码:

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”

如果我尝试它的别名,因为一些应答者的建议,我得到的错误错误1347:'sakila.payment'不是VIEW。

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

预先感谢您。

+0

从发布的,你不会得到错误的你一起在这里显示为您所定义你想要的FIRST_NAME列从客户表中定义它。也许在你的实际连接中,你没有指定表格。 – Niagaradad

+0

尝试选择payment.payment_id,customer.first_name作为customer_firstname,customer.last_name作为customer_last_name ...等等...换句话说,将别名添加到相同的列名... – barudo

+0

@Niagaradad,我确实指定了表在实际加入 –

回答

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_nameselect列表中出现两次。以上阐明了该名称是针对客户还是员工。

+0

现在我得到一个错误说错误1347:'sakila.payment'不是查看。我已经尝试在SELECT语句中使用AS,但它不起作用,那时我也得到了这个确切的错误。 –

+0

@LillaNagy。 。 。我错过了你正在试图给这个视图和表格一样的名字。视图必须有不同的名称。为了这个目的,我常常用'v_'作为前缀。 –

+0

没关系,我忘了提及这一点,我只在几分钟前编辑它。谢谢,我会尝试。 –

0

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

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 ...