Oracle SQL。合并多个表以显示数据失败

时间:2017-10-02 10:52:52

标签: 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  ORDER BY COPY_NUM DESC;

我收到“第3行的错误:ORA-00933:SQL命令未正确结束”

有关代码的任何帮助吗?

`

2 个答案:

答案 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连接语法)有效。

如果转换为使用较新的语法,则代码应为:

SQL Fiddle

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

注意:您没有RENTALCUSTOMER的加入条件,因此它使用的是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;

请注意,我已对列名进行限定。我可能没有正确的表格。当查询具有多个表引用时,应始终使用限定列名。