ORA-00918:列模糊定义

时间:2013-11-21 14:29:21

标签: sql oracle

我正在尝试从我的一个表中检索一些数据(coursename),但以下错误一直在发生

  

ORA-00918:列模糊定义

我输入的命令是:

select bookno,courno,coursename
from booking, course,coursename
where bookno = 6200
and booking.courno = course.courno
and coursename.coursenameno = course.coursenameno

我有一些描述的表格:

CREATE TABLE BOOKING 
    (BOOKNO NUMBER (4) NOT NULL,
     COURNO NUMBER (4) NOT NULL,
     BOOKDATE DATE,
     BOOKCUSTPAYMENT VARCHAR (20),
     CONSTRAINT PK_BOOK PRIMARY KEY (BOOKNO,COURNO),
     CONSTRAINT FK_BOOK FOREIGN KEY (COURNO) REFERENCES COURSE(COURNO)
     ON DELETE CASCADE);

CREATE TABLE CUSTOMER
    (CUSTNO NUMBER (4) NOT NULL, -- creation of primary-key 
     PROFNO NUMBER (4) NOT NULL, 
     CUSTFNAME VARCHAR (15),
     CUSTLNAME VARCHAR (15),
     CUSTDOB DATE,
     CUSTPHONEDAY NUMBER (15),
     CUSTPHONEEVE NUMBER (15),
     CONSTRAINT PK_CUST PRIMARY KEY (CUSTNO),
     CONSTRAINT FK_PROF FOREIGN KEY (PROFNO) REFERENCES PROFICIENCY(PROFNO)
     ON DELETE CASCADE);



CREATE TABLE COURSENAME 
    ( COURSENAMENO NUMBER (4) NOT NULL,
      COURSENAME VARCHAR (20),
      COURSEDESC VARCHAR (120),
      COURSEDAYCOST NUMBER (7,2),
      CONSTRAINT PK_COURSENAME PRIMARY KEY (COURSENAMENO));   


CREATE TABLE COURSE
     (COURNO NUMBER (4) NOT NULL, -- creation of primary-key
      COURSTART DATE,
      COUREND DATE,
      COURSENAMENO NUMBER (4) NOT NULL,
      ACCDAYNO NUMBER (4) NOT NULL,
      FOODNO NUMBER (4) NOT NULL,
      TRANSNO NUMBER (4) NOT NULL, 
      CONSTRAINT PK_COURSE PRIMARY KEY (COURNO),
      CONSTRAINT FK_COURSENAME FOREIGN KEY (COURSENAMENO) REFERENCES COURSENAME(COURSENAMENO));

我正在研究,但我无法弄清楚发生了什么!!!

4 个答案:

答案 0 :(得分:2)

您需要指定应从哪个表中检索SELECTWHERE语句中的列:

select booking.bookno, booking.courno, course.coursename
from booking, course, coursename
where booking.bookno = 6200
and booking.courno = course.courno
and coursename.coursenameno = course.coursenameno

另外,请考虑使用ANSI SQL-92 + JOIN语法,如下所示:

select booking.bookno, booking.courno, course.coursename
from booking
inner join course on booking.courno = course.courno
inner join coursename on coursename.coursenameno = course.coursenameno
where booking.bookno = 6200

有关它的一些推理,请参阅Bad habits to kick : using old-style JOINs

答案 1 :(得分:2)

当同一列出现在多个表中时,您需要指定要使用的表。作为一般规则,使用表(或别名)为列添加前缀始终是一个好主意,因为这样可以提高可读性并加快解析速度。 所以,对于你的查询尝试(大写的变化)

select BOOKING.bookno,BOOKING.courno,COURSENAME.coursename
from booking, course,coursename
where BOOKING.bookno = 6200
and booking.courno = course.courno
and coursename.coursenameno = course.coursenameno

答案 2 :(得分:1)

当列是不明确的时,这意味着数据库不知道要从2个或更多个不同的表中使用哪个列。

您必须在此选择中定义

select tablename.bookno,tablename.courno,tablename.coursename
from booking, course,coursename
where tablename.bookno = 6200
and booking.courno = course.courno                <-- Here its correct
and coursename.coursenameno = course.coursenameno <-- Here its correct

tablename。更改为列所在的正确表格。

答案 3 :(得分:0)

选择中的

字段courno:您尚未定义从哪个表:课程或预订