CREATE TABLE MOBILE_SUB1(
    NAME      VARCHAR(30)  NOT NULL,
    SPEC_CD   VARCHAR(100) NOT NULL,
    COLOR     VARCHAR(10)  NOT NULL,
    MEMO_SIZE NUMBER(4,1)  NULL,
    MEMO_UNIT CHAR(1)      NULL,
    PRICE     NUMBER(5,1)  NULL,
    TOTAL     NUMBER(4,0)  NULL,
    DEL_FLG   CHAR(1)      NULL,
    CRT_DT    TIMESTAMP    NULL,
    CRT_ID    VARCHAR(30)  NULL,
    UPD_DT    TIMESTAMP    NULL,
    UPD_ID    VARCHAR(30)  NULL,
    PRIMARY KEY (NAME,SPEC_CD)
);
CREATE TABLE MOBILE_MAIN1(
    NAME      VARCHAR(30) NOT NULL,
    MAKER     VARCHAR(30) NULL,
    WIDTH     NUMBER(5,1) NULL,
    HEIGHT    NUMBER(5,1) NULL,
    THICKNESS NUMBER(5,1) NULL,
    WEIGHT    NUMBER(4,0) NULL,
    LCD_SIZE  NUMBER(3,1) NULL,
    SALE_DATE DATE        NULL,
    DEL_FLG   CHAR(1)     NULL,
    CRT_DT    TIMESTAMP   NULL,
    CRT_ID    VARCHAR(30) NULL,
    UPD_DT    TIMESTAMP   NULL,
    UPD_ID    VARCHAR(30) NULL,
    PRIMARY KEY (NAME)
);
MOBILE_MAIN1:
NAME    MAKER   WIDTH   ……NOKIA   NOKIA   12      ……
MOBILE_SUB1:
NAME    SPEC_CD   ……NOKIA   N90       ……
NOKIA2  N90       …… 
NOKIA3  N92       …… 
NOKIA1  N93       …… 
NOKI3   N94       …… 
NOKI30  N97       …… 
NOKIA   N95       …… 
NOKIA   N96       …… 
用join……on来检索:
SELECT MOBILE_SUB1.NAME
FROM MOBILE_SUB1 JOIN MOBILE_MAIN1
ON MOBILE_SUB1.NAME = MOBILE_MAIN1.NAME↓
NAMENOKIA
NOKIA
NOKIA
而用NATURAL JOIN 来检索的话,就不出任何结果:
SELECT NAME FROM MOBILE_SUB1 NATURAL JOIN MOBILE_MAIN1 ↓
NAME
why??我觉得两段sql文应该出一样的结果,可是……
请大家帮帮忙,我很困惑啊~~另外,按理说有NATURAL JOIN 关键字的话,select语句任何位置都不能使用列修饰符,
可是我实行了下面的SQL文,居然没报错。(A.在【NAME】字段前面的话报错) 这是oracle容错性好的原因吗?SELECT NAME,A.SPEC_CD FROM MOBILE_SUB1 A NATURAL JOIN MOBILE_MAIN1 

解决方案 »

  1.   

    哦~~谢谢archwuke1 
    明白了,我没有注意到后面几个貌似不重要的字段(flag和日期)名字起的都一样。那你知道我的第二个问题的答案吗?
    为什么没有报错呢?
      

  2.   

    官方文档里对自然连接的描述:
    The NATURAL keyword indicates that a natural join is being performed. A natural join is based on all columns in the two tables that have the same name. It selects rows from the two tables that have equal values in the relevant columns. When specifying columns that are involved in the natural join, do not qualify the column name with a table name or table alias.看红字的说法应该是指关联字段不能加表名或别名,而不是说所有的字段我在10g版本测试
    select * from dept NATURAL JOIN emp where emp.ename='SMITH'
    这样没问题

    select * from dept NATURAL JOIN emp where emp.deptno=20
    这样就报错:ORA-25155: NATURAL 联接中使用的列不能有限定词这个错误信息里面也是说natural联接使用的列,而非任意列