Mysql创建视图错误1052

时间:2014-05-25 21:21:24

标签: mysql view syntax-error

Hello stackoverflow人员

我有2个表共享相同的属性,但是在不同的类别中。我试图仅使用“Rending”属性列出项目:

CREATE VIEW rending AS SELECT ranged_weapons.Name_, ranged_weapons.Dam, ranged_weapons.Dam_Type,
melee_weapons.Name_, melee_weapons.Dam, melee_weapons.Dam_Type
FROM ranged_weapons, melee_weapons 
WHERE Dam_Type = 'Rending';

但是当我运行它时,我得到:

Error Code: 1052. Column 'Dam_Type' in where clause is ambiguous

我做错了什么?

表格信息

  CREATE TABLE Ranged_weapons (
  Name_             varchar (40) NOT NULL,
  Class             varchar (40),
  Type_             varchar (40),
  Range_            varchar (40),
  RoF               varchar (40),
  Dam               varchar (40),
  Dam_Type          varchar (10),
  Pen               integer     ,
  Clip              integer     ,
  Rld               varchar (10),
  PRIMARY KEY (Name_),
  FOREIGN KEY (Name_) REFERENCES Items(Name_) ON DELETE CASCADE );


  CREATE TABLE Melee_weapons (
  Name_             varchar (40) NOT NULL,
  Type_             varchar (40),
  Dam               varchar (40),
  Dam_Type          varchar (40),
  Pen               integer     ,
  PRIMARY KEY (Name_),
  FOREIGN KEY (Name_) REFERENCES Items(Name_) ON DELETE CASCADE );

2 个答案:

答案 0 :(得分:1)

多数民众所说这一切都意味着这两个表中都存在列,你需要明确提到你指的是哪个表列

CREATE VIEW rending AS SELECT *
FROM ranged_weapons, melee_weapons 
WHERE ranged_weapons.Dam_Type = 'Rending';

更新:使用上面的代码从给定的表结构中将显示重复的列名错误,因为表中的列名相同。

最好的方法是使用JOIN为视图显式选择列,或者如果需要从另一个表中选择相同的列,然后使用不同的别名。以下是我们如何使用JOIN

选择和创建视图的示例
CREATE VIEW rending AS 
SELECT rw.Name_,rw.Class,rw.Type_,rw.Range_,
rw.RoF,rw.Dam,rw.Dam_Type,rw.Pen ,rw.Clip,rw.Rld
FROM ranged_weapons rw
JOIN melee_weapons mw on mw.Name_ = rw.Name_
WHERE rw.Dam_Type = 'Rending';

如果要为不同表格中的视图选择相同的列,可以使用别名

CREATE VIEW rending AS 
SELECT rw.Name_,rw.Class,rw.Type_,rw.Range_,
rw.RoF,rw.Dam,rw.Dam_Type,rw.Pen ,rw.Clip,rw.Rld,
mw.Name_ as mw_Name
FROM ranged_weapons rw
JOIN melee_weapons mw on mw.Name_ = rw.Name_
WHERE rw.Dam_Type = 'Rending';

此处mw.Name_ as mw_Name将引用melee_weapons中的列,如果视图需要,您可以通过这种方式指定其他列名。

答案 1 :(得分:0)

两个表中都存在DAM_TYPE,这就是为什么where子句无法识别它...

您必须在where子句中使用DAM_TYPE编写table_name。

由于