【问题标题】:Alias naming the same table used to self compare inside query (ORACLE DB)用于在查询内部进行自我比较的同一个表的别名 (ORACLE DB)
【发布时间】: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) ... 或派生表。问:你为什么要这样做?这不是真的必要。只需提供表别名(相关名称)并使用与第二个查询中相同的列名。
  • 自然连接的目的是什么,除了源表结构将来发生变化时的歧义?使用带有表别名的显式连接和列名,这将帮助您在几年后理解查询的想法。

标签: sql oracle sqlplus


【解决方案1】:

如果您的表没有外键约束,NATURAL JOIN 子句将不起作用。

顺便说一句,请避免使用 NATURAL JOIN,使用显式 JOIN 已在此处解释: https://rules.sonarsource.com/plsql/RSPEC-2521

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-06-21
    • 1970-01-01
    • 2021-03-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-17
    相关资源
    最近更新 更多