sql - ORACLE/SQL - 连接3个并非全部互连的表

标签 sql oracle join

我需要帮助连接 3 个未全部互连的表

假设我有表 A、B、C

这是关系

A.类型=B.类型

A.模型=C.模型

我需要做的是内连接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 语句中的表。”

最佳答案

我知道这是一个风格问题,但在我看来,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)

关于sql - ORACLE/SQL - 连接3个并非全部互连的表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5760020/

相关文章:

sql - 为什么 Oracle SQL 不允许我们在 GROUP BY 子句中使用列别名?

mysql - 在 MySQL 查询中使用 IF 条件计数

mysql - 根据第三个 "key"表从两个表返回值,然后将值相乘并求和

mysql - 将内部联接结果合并到一列

mysql - 如何在不删除 MySQL 数据的情况下删除分区?

mysql - SQL:查询得到公司平均工资和部门平均值

php - 仅从完整的 MySql 数据库导出导入表

MySQL 多表连接四个表(种族和结果表)

java - 代码中的 NullPointerException

oracle - 如何在oracle的字母数字列中使用order by