我正在尝试组合多个表来显示数据,但它失败了。
这是我的代码:
`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命令未正确结束”
有关代码的任何帮助吗?
`
答案 0 :(得分:2)
您正在将旧的旧版(逗号)连接语法与更新的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 ...
(完全使用遗留语法)或
FROM CUSTOMER, RENTAL INNER JOIN MOVIE_COPY
ON RENTAL.COPY_NUM = MOVIE_COPY.COPY_NUM
WHERE ...
(使用较新的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
)
/
查询1 :
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
注意:您没有RENTAL
和CUSTOMER
的加入条件,因此它使用的是CROSS JOIN
- 较新的语法更清楚地表明这是缺少的,并且您可能希望将其更改为INNER JOIN
并添加适当的条件。
答案 1 :(得分:0)
从不在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;
请注意,我已对列名进行限定。我可能没有正确的表格。当查询具有多个表引用时,应始终使用限定列名。