SQL:了解FULL OUTER JOIN的工作原理

时间:2019-04-20 09:27:35

标签: sql postgresql

我有一个名为Movie,Genre和Keyword的表,从中创建了一个名为“ genkeyword”的视图。视图“ genkeyword”具有很多元组,因此可以在DB Fiddle处对其进行访问。

以下查询计算genkeyword中的电影与Harry Potter共同的类型的频率以及genkeyword中的电影与Harry Potter共同的关键字的频率。然后,它使用完整的外部联接将两个查询的结果合并在一起。

SELECT
    *
FROM
    (
        SELECT
            title,
            year,
            count(distinct genre) as genre_freq
        FROM
            genkeyword
        where
            (
                genre in (
                    select
                        genre
                    from
                        genkeyword
                    where
                        title = 'Harry Potter and the 
Deathly Hallows'
                )
            )
            AND title <> 'Harry Potter and the Deathly Hallows'
        group by
            title,
            year
    ) a 
    FULL OUTER JOIN (
        select
            title,
            year,
            count(distinct keyword) as keyword_freq
        FROM
            genkeyword
        where
            keyword in (
                select
                    keyword
                from
                    genkeyword
                where
                    title = 'Harry Potter and 
the Deathly Hallows'
            )
            and title <> 'Harry Potter and the Deathly Hallows'
        group by
            title,
            year
    ) b ON b.title = a.title;

上述查询的输出如下:

title               |   year    |   genre_freq   |    title    |    year    | keyword_freq

Cinderella              2015         2              Cinderella      2015        2   

Enchanted               2007         1              Enchanted       2007        3

How to train your dragon  2010       2               null           null       null
The Shape of Water        2017       2        The Shape of Water    2017       1       

我知道对于两个结果集A和B,完整的外部联接将输出A和B中匹配的行,以及A中不匹配B中的行和B中匹配行的行A中没有匹配的行。

但是,在输出的第三行(电影是“如何训练龙”)中,为什么title和year属性的值为空?我知道对于keyword_freq来说,该值将为null,因为电影没有与哈利·波特相同的任何关键字,但是title和year属性分别没有值“ How to training your dragon”和2010吗? / p>

任何见解都值得赞赏。

0 个答案:

没有答案