Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/62.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/redis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 如何在具有联接的查询中创建视图?_Mysql_View_Mysql Error 1060 - Fatal编程技术网

Mysql 如何在具有联接的查询中创建视图?

Mysql 如何在具有联接的查询中创建视图?,mysql,view,mysql-error-1060,Mysql,View,Mysql Error 1060,您好,我无法为以下查询创建视图 create view my_View as select * from product p LEFT JOIN product_description pd ON (p.product_id=pd.product_id) 我有两张桌子 表1:- 列为的产品:-产品标识,第2列,第3列 表2:-产品描述,列为:-产品id,第4列,第5列。 这里product_id是product表的外键 下面是我得到的错误 错误代码:1060。重复的列名“product

您好,我无法为以下查询创建视图

create view  my_View as 
select *  from product p 
LEFT JOIN product_description pd ON (p.product_id=pd.product_id)
我有两张桌子 表1:- 列为的产品:-产品标识,第2列,第3列 表2:-产品描述,列为:-产品id,第4列,第5列。 这里product_id是product表的外键

下面是我得到的错误

错误代码:1060。重复的列名“product\u id”


我正在使用mysql工作台运行我的查询。看到这个错误,我知道我需要分配别名。但我需要加入5-8个以上的表,这就是我寻找更好解决方案的原因。

在您的情况下,最简单的解决方案是使用,而不是打开:


但是,一般来说,您应该在select中显式列出列,而不是使用*,第二件事是,使用*获取视图中的所有记录从来都不是一个好的做法,除非您真的想要在联接条件中使用的所有表中的所有记录

您可以选择特定于视图的记录,如

select p.*,pd.somefield  from product p 
LEFT JOIN product_description pd ON (p.product_id=pd.product_id)
在上面的查询中,您的产品id仅从产品表中获取,您只能从产品描述表中获取必要的字段。

SELECT*将从联接中的两个表中选择所有列。但是这两个表都有一个名为product_id的列,因此您将在视图中得到两个同名的列

您需要列出所有列,以便为product_description.product_id提供别名以区分:

SELECT p.product_id, p.column2, p.column3, pd.product_id AS pd_id, pd.column4, pd.column5
FROM product AS p
LEFT JOIN product_description AS pd ON p.product_id = pd.product_id

您的SELECT*将返回两个名为product_id的列-而不是使用SELECT*列出您的列,如SELECT product_id、column2、column3等。您不需要返回product_id两次。如前所述,我理解这种方法。但我想如果有其他方法的话。我确实读了你的完整问题,使用SELECT*是一个坏习惯。@Ashish你需要打字。由于懒惰,没有消除列歧义的神奇解决方案。可能不是我的DV的副本,但我认为这不会解决错误。@bluefeet。1应该是这样。2它在SQL FIDLE中执行。你能删除否决票吗?正如我所说,这不是我的DV,所以我不能删除它。我认为这个解决方案非常脆弱,根本不是一个好的建议。它依赖于这样一个假设:连接键是目前两个表之间共享的唯一列名,并且在将来也将如此。例如,如果两个表都有一个名为ModifiedDate的列,则此操作将中断。@AaronBertrand。建议列出所有的专栏,看看我在建议后写了什么。使用是一种绕过OP原始问题中特定问题的方法,该问题只涉及两个表格。
SELECT p.product_id, p.column2, p.column3, pd.product_id AS pd_id, pd.column4, pd.column5
FROM product AS p
LEFT JOIN product_description AS pd ON p.product_id = pd.product_id