sql - 我误解了联接吗?

标签 sql oracle outer-join

我正在尝试学习 ansi-92 SQL 标准,但我似乎并没有完全理解它(我对 ansi-89 标准以及一般的数据库也是新手)。

在我的例子中,我有三个表 Kingdom -< family -< species(生物学分类)。

  • 可能存在没有物种或家族的王国。
  • 可能有没有物种或物种的家庭。
  • 可能存在没有界或科的物种。

  • 为什么会发生这种情况?

    比如说一个生物学家,发现了一个新物种,但他没有把它归入一个界或科,创建一个没有物种的新科,并且不确定它应该属于哪个界,等等。

    这是一个 fiddle (见最后一个查询):http://sqlfiddle.com/#!4/015d1/3

    我想做一个查询来检索我的每个王国、每个物种,但不是那些没有物种的家庭,所以我做了这个。
        select *
        from reino r
             left join (
                 familia f             
                 right join especie e
                     on f.fnombre = e.efamilia
                     and f.freino = e.ereino
             ) on r.rnombre = f.freino 
               and r.rnombre = e.ereino;
    

    我认为这会做的是:
  • 加入家庭和物种作为一个正确的加入,所以它带来了每个物种,但不会带来那些没有物种的家庭。所以,如果一个物种没有被归入一个科,它会在科上显示为空。
  • 然后,以左联接的结果加入王国,因此它带来每个王国,即使在该王国中没有分类的科或种。

  • 我错了吗?这不应该让我看到那些没有被分类的物种吗?如果我进行内部查询,它会带来我想要的。我在分组的地方有问题吗?

    最佳答案

    如果这有帮助:

    Relationally speaking, [OUTER JOIN is] a kind of shotgun marriage: It forces tables into a kind of union—yes, I do mean union, not join—even when the tables in question fail to conform to the usual requirements for union. It does this, in effect, by padding one or both of the tables with nulls before doing the union, thereby making them conform to those usual requirements after all. But there's no reason why that padding shouldn't be done with proper values instead of nulls, as in this example:


    SELECT SNO , PNO 
    FROM   SP 
    UNION  
    SELECT SNO , 'nil' AS PNO 
    FROM   S 
    WHERE  SNO NOT IN ( SELECT SNO FROM SP )
    

    以上相当于:
    SELECT SNO , COALESCE ( PNO , 'nil' ) AS PNO 
    FROM   S NATURAL LEFT OUTER JOIN SP
    

    来源:
    SQL and Relational Theory: How to Write Accurate SQL Code By C. J. Date

    关于sql - 我误解了联接吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9901403/

    相关文章:

    oracle - 以有限的控制获取Oracle View定义

    java - Oracle/Mysql编辑记录量大,有推荐吗?

    python - 如何修复 'Can' t 在 'localhost:3306' 错误上连接到 MySQL 服务器

    sql - oracle pl/sql ORA-01790 : expression must have same datatype as corresponding expression

    sql - 如何与具有复合主键的表建立关系?

    mysql - 左连接两个单独的查询

    sql - 自连接与内部和外部连接查询

    sql - 在 WHERE IN() 或 SELECT 和 LEFT JOIN 上保持空关系

    sql - Oracle Exadata - LEFT OUTER JOIN 在连接条件下使用 AND 时表现得像 INNER

    在另一个表上使用条件 WHERE 时从一个表返回各种行的 SQL 查询