gpt4 book ai didi

sql - 左连接和内连接的区别......永远一次

转载 作者:行者123 更新时间:2023-12-05 01:25:29 26 4
gpt4 key购买 nike

我知道这里和互联网上已经创建了许多关于此主题的线程。但我真的无法得到关于这两个陈述之间差异的最后一点!我的意思是,尝试和尝试我可以通过我的查询达到我需要的所有结果,但我真的没有完全控制刀!

我认为自己是一个非常好的程序员和一个非常好的 SQL-ista,对此我感到有点惭愧......

下面是一个例子:

  • 我有一个包含网站页面的表格(“web_page”)
  • 带有类别(“类别”)的表格。
  • 一个类别可以包含一个或多个页面,但反之则不然
  • 一个类别可能根本不包含任何页面
  • 网页在网站中是否可见

  • 所以如果我想显示所有类别及其页面,我的意思是有页面和没有页面的类别,我必须做这样的事情:
    FROM category
    LEFT JOIN web_page ON ( web_page.category_id = category.category_id AND web_page.active = "Y" )

    因此,如果某个类别没有页面,我将在该类别的记录中看到 web_page_id NULL。

    但如果我这样做:
    FROM category
    LEFT JOIN web_page ON ( web_page.category_id = category.category_id )
    ...
    WHERE web_page.active = "Y"...

    我将只选择至少有一个 web_page 的类别...但为什么呢?

    这只是一个例子......我想永远理解这种差异!

    谢谢你。

    最佳答案

    要使您的查询按预期工作,请将条件放入 ON条款:

    FROM category
    LEFT JOIN web_page ON web_page.category_id = category
    and web_page.active = "Y"

    这样做的原因是(对于大多数数据库,但不是全部) WHERE子句在行连接后过滤行。如果加入没有导致网页行加入(因为类别没有网页),那么网页的所有列将为 null ,以及任何值(如 "Y" )与 null 的比较为 false,因此将过滤掉那些非连接行。

    但是,通过将条件移动到 ON子句,条件在进行连接时执行,因此您只能连接 active = "Y" 的行。 ,但如果没有任何这样的行,你只会得到左连接 null网页。

    这个版本的查询实际上是在说:“给我所有类别及其事件网页(如果有)”

    请注意,我说的是“大多数数据库”……例如 mysql 足够聪明,可以理解您要执行的操作,并且如果在 mysql 上运行,您的查询将按预期工作。

    关于sql - 左连接和内连接的区别......永远一次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11329683/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com