【问题标题】:ORACLE/SQL - Joining 3 tables that aren't all interconnectedORACLE/SQL - 连接 3 个并非全部互连的表
【发布时间】:2011-04-22 21:03:20
【问题描述】:

我需要帮助加入 3 个表,它们并非全部互连

假设我有表 A、B、C

这里是关系

A.type = B.type

A.model = C.model

我需要做的是内连接 A 和 B 并返回所有匹配的 A 记录。接下来我需要从 C 中提取与先前连接匹配的记录。

或者换句话说,C中的所有记录都在A中,而A在B中

希望这是有道理的。抱歉没有数据示例。

我试过了

select
    c.*
from
    c, a, b
where
    c.model_ = a.model_
    and a.type_ = b.type_

但收到此消息“错误:查询具有 MERGE JOIN CARTESIAN。您必须更正 where 子句才能在 select 语句中正确连接表。'

【问题讨论】:

  • 这不是 Oracle 错误。事实上,“MERGE JOIN CARTESIAN”本身并不是“错误”。

标签: sql oracle join


【解决方案1】:

我知道这是一个风格问题,但在我看来,ansi 风格的加入让这一点更加清晰:

SELECT c.*
FROM c
JOIN a ON a.model = c.model
JOIN b on b.type = a.type

如果您在 a 或 b 中有多个匹配元素,此查询将返回重复项。您可以添加 DISTINCT 或将其重写为 EXISTS 查询:

SELECT *
FROM c
WHERE EXISTS (SELECT 1
              FROM a
              JOIN b ON b.type = a.type
              WHERE a.model = c.model)

我认为这也应该给出相同的结果,只要模型中没有 NULL 值:

SELECT *
FROM c
WHERE c.model IN (SELECT a.model
                  FROM a
                  JOIN b ON b.type = a.type)

【讨论】:

  • 风格区分了难以发现的错误和容易发现的错误。我喜欢 JOIN - 它明确显示了您的意思。
【解决方案2】:

也只需用 AND 条件连接到 C

【讨论】:

    【解决方案3】:

    没有数据样本,很难理解实际问题和验证查询。

    你试过了吗..

    Select c.*
       from a,b,c
        where a.type = b.type
          and a.model = c.model;
    

    您是否丢失了一些记录或看到了您不希望看到的额外记录?

    上述查询只会为您提供 c 中位于 a 中且 a 记录与 b 中的条件匹配的记录。

    【讨论】:

    • 用我的尝试和我看到的错误更新了我的原始帖子,这可能是我对表格的排序以及如何应用连接吗?
    • 这是您看到的实际错误吗? (是否有 ORA 编号)。此外,是 a、b、c 表/它们是否具有自己的基础查询的视图..?
    • 不幸的是,错误是由我们基于 Web 的工具产生的,这就是我所拥有的。这些表都不是视图。
    猜你喜欢
    • 2015-06-02
    • 1970-01-01
    • 2012-03-15
    • 1970-01-01
    • 2018-05-01
    • 2012-02-22
    • 1970-01-01
    • 1970-01-01
    • 2011-01-01
    相关资源
    最近更新 更多