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(见上面的评论)。此外,“从不使用逗号”是扁平的