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
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
明白了,我没有注意到后面几个貌似不重要的字段(flag和日期)名字起的都一样。那你知道我的第二个问题的答案吗?
为什么没有报错呢?
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联接使用的列,而非任意列