【发布时间】:2021-12-09 20:34:16
【问题描述】:
我有一个客户表,我正在编写一个查询来查看哪些客户共享同一个电话号码。
结构和查询:
CREATE TABLE Client
(noClient INTEGER NOT NULL,
nameClient VARCHAR(20) NOT NULL,
noTelephone VARCHAR(15) NOT NULL,
PRIMARY KEY (noClient)
);
SELECT c.nameClient, c2.nameClient2
FROM Client c NATURAL JOIN Client c2(noClient2, nameClient2, noTelephone)
WHERE c.nomClient < c2.nomClient
这里的问题是我不断收到错误
FROM Client c NATURAL JOIN Client c2(noClient2, nameClient2, noTelephone)
*
ERROR at line 2:
ORA-00933: SQL Command not properly ended
是否有正确的方法来重命名表及其列?
我有一个解决方案,但我想知道在查询中创建表(及其列)别名的正确语法。 当然,如果在使用同一张表比较它的值时有更好的方法来处理它
解决方法是在不重命名列的情况下强制加入 noTelephone:
SELECT c.nameClient, c2.nameClient
FROM Client c JOIN Client c2 ON c.noTelephone = c2.noTelephone
WHERE c.nameClient < c2.nameClient
【问题讨论】:
-
Oracle 可能不支持这种形式。但是您可以使用
WITH子句:WITH cte (new1, new2, new3) AS (SELECT old1, old2, old3 FROM tablename) ...或派生表。问:你为什么要这样做?这不是真的必要。只需提供表别名(相关名称)并使用与第二个查询中相同的列名。 -
自然连接的目的是什么,除了源表结构将来发生变化时的歧义?使用带有表别名的显式连接和列名,这将帮助您在几年后理解查询的想法。