Oracle SQL。合并多个表以显示数据失败
我试图合并多个表来显示数据,但失败了 这是我的密码:Oracle SQL。合并多个表以显示数据失败,sql,oracle,Sql,Oracle,我试图合并多个表来显示数据,但失败了 这是我的密码: `SQL> SELECT CUST_ID, CUST_PHONE, MOVIE_COPY.COPY_NUM, RENTAL.COPY_NUM,BRANCH_NUM,RENTED_DATES,RETURN_DATES 2 FROM RENTAL,CUSTOMER,MOVIE_COPY 3 ON RENTAL.COPY_NUM = MOVIE_COPY.COPY_NUM 4 WHERE CUST_ID=11004 5
`SQL> SELECT CUST_ID, CUST_PHONE, MOVIE_COPY.COPY_NUM, RENTAL.COPY_NUM,BRANCH_NUM,RENTED_DATES,RETURN_DATES
2 FROM RENTAL,CUSTOMER,MOVIE_COPY
3 ON RENTAL.COPY_NUM = MOVIE_COPY.COPY_NUM
4 WHERE CUST_ID=11004
5 ORDER BY COPY_NUM DESC;
我得到“第3行错误:ORA-00933:SQL命令未正确结束”
有代码方面的帮助吗
`切勿在FROM
子句中使用逗号。始终使用明确、正确的JOIN
语法
您的查询应该如下所示:
SELECT C.CUST_ID, C.CUST_PHONE, MC.COPY_NUM,
R.COPY_NUM, R.BRANCH_NUM, R.RENTED_DATES, R.RETURN_DATES
FROM RENTAL R JOIN
CUSTOMER C
ON R.CUST_ID = C.CUST_ID JOIN
MOVIE_COPY MC
ON R.COPY_NUM = MC.COPY_NUM
WHERE C.CUST_ID = 11004
ORDER BY R.COPY_NUM DESC;
注意,我已经限定了列名。我的桌子可能不对。当查询有多个表引用时,应始终使用限定列名。切勿在FROM
子句中使用逗号。始终使用明确、正确的JOIN
语法
您的查询应该如下所示:
SELECT C.CUST_ID, C.CUST_PHONE, MC.COPY_NUM,
R.COPY_NUM, R.BRANCH_NUM, R.RENTED_DATES, R.RETURN_DATES
FROM RENTAL R JOIN
CUSTOMER C
ON R.CUST_ID = C.CUST_ID JOIN
MOVIE_COPY MC
ON R.COPY_NUM = MC.COPY_NUM
WHERE C.CUST_ID = 11004
ORDER BY R.COPY_NUM DESC;
注意,我已经限定了列名。我的桌子可能不对。当查询有多个表引用时,应始终使用限定列名。您将旧的旧的(逗号)联接语法与新的ANSI联接语法混合在一起,从而导致错误:
FROM RENTAL, CUSTOMER, MOVIE_COPY
ON RENTAL.COPY_NUM = MOVIE_COPY.COPY_NUM
WHERE ...
这是无效的
FROM RENTAL, CUSTOMER, MOVIE_COPY
WHERE RENTAL.COPY_NUM = MOVIE_COPY.COPY_NUM
AND ...
(完全使用传统语法)或
(使用较新的ANSI联接语法)是有效的
如果您转换为使用较新的语法,那么您的代码应该如下所示:
Oracle 11g R2架构设置:
CREATE TABLE customer (
CUST_ID NUMBER,
CUST_PHONE NUMBER
)
/
CREATE TABLE rental (
copy_num NUMBER,
branch_num NUMBER,
rented_dates DATE,
return_dates DATE
)
/
CREATE TABLE movie_copy (
copy_num NUMBER
)
/
SELECT CUST_ID,
CUST_PHONE,
MOVIE_COPY.COPY_NUM,
RENTAL.COPY_NUM,
BRANCH_NUM,
RENTED_DATES,
RETURN_DATES
FROM RENTAL
CROSS JOIN CUSTOMER
INNER JOIN MOVIE_COPY
ON RENTAL.COPY_NUM = MOVIE_COPY.COPY_NUM
WHERE CUST_ID=11004
ORDER BY MOVIE_COPY.COPY_NUM DESC
查询1:
CREATE TABLE customer (
CUST_ID NUMBER,
CUST_PHONE NUMBER
)
/
CREATE TABLE rental (
copy_num NUMBER,
branch_num NUMBER,
rented_dates DATE,
return_dates DATE
)
/
CREATE TABLE movie_copy (
copy_num NUMBER
)
/
SELECT CUST_ID,
CUST_PHONE,
MOVIE_COPY.COPY_NUM,
RENTAL.COPY_NUM,
BRANCH_NUM,
RENTED_DATES,
RETURN_DATES
FROM RENTAL
CROSS JOIN CUSTOMER
INNER JOIN MOVIE_COPY
ON RENTAL.COPY_NUM = MOVIE_COPY.COPY_NUM
WHERE CUST_ID=11004
ORDER BY MOVIE_COPY.COPY_NUM DESC
注意:您没有
租赁
和客户
的连接条件,因此它使用了交叉连接
-较新的语法更清楚地表明缺少此连接,您可能希望将其更改为内部连接
,并添加适当的条件。您正在混合旧的遗留(逗号)使用较新的ANSI join语法的join语法创建错误:
FROM RENTAL, CUSTOMER, MOVIE_COPY
ON RENTAL.COPY_NUM = MOVIE_COPY.COPY_NUM
WHERE ...
这是无效的
FROM RENTAL, CUSTOMER, MOVIE_COPY
WHERE RENTAL.COPY_NUM = MOVIE_COPY.COPY_NUM
AND ...
(完全使用传统语法)或
(使用较新的ANSI联接语法)是有效的
如果您转换为使用较新的语法,那么您的代码应该如下所示:
Oracle 11g R2架构设置:
CREATE TABLE customer (
CUST_ID NUMBER,
CUST_PHONE NUMBER
)
/
CREATE TABLE rental (
copy_num NUMBER,
branch_num NUMBER,
rented_dates DATE,
return_dates DATE
)
/
CREATE TABLE movie_copy (
copy_num NUMBER
)
/
SELECT CUST_ID,
CUST_PHONE,
MOVIE_COPY.COPY_NUM,
RENTAL.COPY_NUM,
BRANCH_NUM,
RENTED_DATES,
RETURN_DATES
FROM RENTAL
CROSS JOIN CUSTOMER
INNER JOIN MOVIE_COPY
ON RENTAL.COPY_NUM = MOVIE_COPY.COPY_NUM
WHERE CUST_ID=11004
ORDER BY MOVIE_COPY.COPY_NUM DESC
查询1:
CREATE TABLE customer (
CUST_ID NUMBER,
CUST_PHONE NUMBER
)
/
CREATE TABLE rental (
copy_num NUMBER,
branch_num NUMBER,
rented_dates DATE,
return_dates DATE
)
/
CREATE TABLE movie_copy (
copy_num NUMBER
)
/
SELECT CUST_ID,
CUST_PHONE,
MOVIE_COPY.COPY_NUM,
RENTAL.COPY_NUM,
BRANCH_NUM,
RENTED_DATES,
RETURN_DATES
FROM RENTAL
CROSS JOIN CUSTOMER
INNER JOIN MOVIE_COPY
ON RENTAL.COPY_NUM = MOVIE_COPY.COPY_NUM
WHERE CUST_ID=11004
ORDER BY MOVIE_COPY.COPY_NUM DESC
注意:您没有
租赁
和客户
的联接条件,因此它使用了交叉联接
——较新的语法更清楚地表明缺少该联接,您可能希望将其更改为内部联接
,并添加适当的条件。您正在混合隐式联接和显式联接语法。坚持加入。。。使用
语法而不是逗号分隔语法。您混合了隐式和显式连接语法。坚持加入。。。在
语法而不是逗号分隔语法上。我在第3行得到错误:ORA-00923:FROM关键字未找到,在哪里expected@c0nfus3d我没有收到该错误-请检查您是否正确复制了它。好的,我输入了>而不是,但是现在我在第12行得到了错误:ORA-00918:列用您的代码含糊不清地定义。当然,可以将旧的传统连接语法与新的Ansi连接语法混合使用。这样做可能是不明智的。但执行“从客户,租赁内部加入租赁上的MOVIE\u COPY 3.COPY\u NUM=MOVIE\u COPY.COPY\u NUM”并没有问题。说一种连接语法优于另一种有点意识形态。必须使用遗留系统,我必须说,必须同时使用和理解这两种系统!哦-好吧,我的错,我没有仔细阅读OP的查询。您要指出的一点(我会用不同的措辞)是OP的查询既不使用遗留语法也不使用ANSI语法,因为他不使用JOIN关键字,但他有一个ON条件。这既不是传统语法,也不是ANSI语法——它不是“混合”这两种语法,而是将每种语法的一点混合到同一个连接中。但除了措辞,我明白你的意思,我同意。我在第3行得到错误:ORA-00923:FROM关键字未找到在哪里expected@c0nfus3d我没有收到该错误-请检查您是否正确复制了它。好的,我输入了>而不是,但是现在我在第12行得到了错误:ORA-00918:列用您的代码含糊不清地定义。当然,可以将旧的传统连接语法与新的Ansi连接语法混合使用。这样做可能是不明智的。但执行“从客户,租赁内部加入租赁上的MOVIE\u COPY 3.COPY\u NUM=MOVIE\u COPY.COPY\u NUM”并没有问题。说一种连接语法优于另一种有点意识形态。必须使用遗留系统,我必须说,必须同时使用和理解这两种系统!哦-好吧,我的错,我没有仔细阅读OP的查询。您要指出的一点(我会用不同的措辞)是OP的查询既不使用遗留语法也不使用ANSI语法,因为他不使用JOIN关键字,但他有一个ON条件。这既不是传统语法,也不是ANSI语法——它不是“混合”这两种语法,而是将每种语法的一点混合到同一个连接中。但是除了措辞之外,我明白你的意思,我同意。我在第5行得到错误:ORA-00933:SQL命令没有正确地以你的code@c0nfus3d . . . 我看不出任何明显的错误会导致这个问题。@c0nfus3d。这不是这个答案中的疑问。你关于“从不在from子句中使用逗号”的陈述不是技术性的,而是意识形态性的。我同意@sers(见上面的评论)。此外,“永远不要使用逗号”是完全不正确的。有(少数)实例实际上禁止使用ANSI连接语法(Oracle的不健康规则)。其中之一是提交时刷新的物化视图。它们确实允许连接,但前提是连接使用旧的Oracle专有语法code@c0nfus3d . . . 我看不出任何明显的错误会导致这个问题。@c0nfus3d。这不是这个答案中的疑问。你关于“从不在from子句中使用逗号”的陈述不是技术性的,而是意识形态性的。我同意@sers(见上面的评论)。此外,“从不使用逗号”是扁平的