在单个查询中使用多个联接

Posted

技术标签:

【中文标题】在单个查询中使用多个联接【英文标题】:use multiple join in a single query 【发布时间】:2022-01-19 14:54:25 【问题描述】:

我正在尝试修改先前的查询以删除 where 部分并使用 join,但是在执行此操作时出现错误。我尝试阅读 Oracle 文档,但没有找到任何可以解决我的错误的内容。

上一个查询:

SELECT DISTINCT 
    CLI.IDCLI, CLI.NOMCLI,CLI.PRENOMCLI
FROM
    LIVRAISON LIV, LIVRAISON LIV1, CLIENT CLI, COMMANDE COM, CLIENT CLI1, COMMANDE COM1
WHERE 
    CLI.IDCLI = COM.IDCLI
    AND COM.IDCOM = LIV.IDCOM
    AND CLI1.IDCLI = COM1.IDCLI
    AND COM1.IDCOM = LIV1.IDCOM
    AND LIV.DATELIV = LIV1.DATELIV
    AND LIV.IDLIV = LIV1.IDLIV
    AND CLI1.NOMCLI = 'MARTIN'
    AND CLI.IDCLI != CLI1.IDCLI
ORDER BY 
    CLI.IDCLI ASC;

新查询和错误:

SQL> SELECT DISTINCT CLI.IDCLI, CLI.NOMCLI,CLI.PRENOMCLI
  2  FROM LIVRAISON LIV      NATURAL JOIN LIVRAISON LIV1
  3                          INNER JOIN COMMANDE COM       ON COM.IDCOM=LIV.IDCOM,
  4        LIV1              INNER JOIN COMMANDE COM1      ON LIV1.IDCOM=COM1.IDCOM,
  5        CLIENT CLI        INNER JOIN COM                ON CLI.IDCLI=COM.IDCOM,
  6        COM1              INNER JOIN CLIENT CLI1        ON CLI1.IDCLI=COM1.IDCLI
  7  WHERE CLI1.NOMCLI='MARTIN'
  8  AND CLI.IDCLI!= CLI1.IDCLI
  9  ORDER BY CLI.IDCLI ASC;
      COM1              INNER JOIN CLIENT CLI1        ON CLI1.IDCLI=COM1.IDCLI
      *
ERROR at line 6:
ORA-00942: table or view does not exist

【问题讨论】:

提示 1:跳过 NATURAL JOIN,进行常规 INNER JOIN 并明确指定连接条件! 提示 2:请将您的 SQL 格式化为可读。 提示 3:切勿混用显式和隐式连接。实际上总是使用显式的JOIN 语法。 你弄乱了表别名。每一个只能指定一次。 【参考方案1】:

避免 NATURAL JOIN,除非您是 join magic 方面的资深专家。

不要将旧的逗号语法与连接语法混用。

使用唯一的表别名。

SELECT DISTINCT
  CLI.IDCLI, 
  CLI.NOMCLI, 
  CLI.PRENOMCLI
FROM LIVRAISON LIV
JOIN LIVRAISON LIV2 ON LIV2.DATELIV = LIV.DATELIV
                   AND LIV2.IDLIV   = LIV.IDLIV
JOIN COMMANDE  COM  ON COM.IDCOM    = LIV.IDCOM
JOIN CLIENT    CLI  ON CLI.IDCLI    = COM.IDCLI
JOIN COMMANDE  COM2 ON COM2.IDCOM   = LIV2.IDCOM
JOIN CLIENT    CLI2 ON CLI2.IDCLI   = COM2.IDCLI
WHERE CLI2.NOMCLI = 'MARTIN'
  AND CLI.IDCLI  != CLI2.IDCLI
ORDER BY 
  CLI.IDCLI ASC;

【讨论】:

以上是关于在单个查询中使用多个联接的主要内容,如果未能解决你的问题,请参考以下文章

如何在单个查询中使用联接和聚合函数更新表中的多行

如何将 Sqlalchemy ORM 查询结果转换为包含关系的单个联接表?

使用联接的 SQL Server 全文搜索无法按预期工作

在 SQL 子查询中使用多个表进行 Oracle 半联接

MySQL 一个查询中的多个联接?

有啥方法可以避免一个查询中的多个联接