连接中外部的要点是什么?

use*_*695 6 join sql-server

我制作了一个脚本,它从交换机端口获取 mac 地址并将它们放入数据库中。我将它插入到导入表中,稍后将复制到实际表中。一切都很好。现在我正在编写查询以查找哪些 mac 地址是新的。所以,我需要导入表中不在目标表中的行。左外连接是有意义的:

select *
from SwitchportMac_import i
left outer join SwitchportMac sm 
on sm.switch = i.switch and sm.port = i.port and sm.mac = i.mac
Run Code Online (Sandbox Code Playgroud)

这也返回i匹配 in 的行sm。当然,我可以添加一个,where sm.id is null但我大吃一惊。

所以要么:

  • 我是个白痴,做了明显错误的事情
  • 我是个白痴,20年来一直在解释和理解加入错误

如果是第一个,我会转储 DDL 并弄清楚,但我害怕这是第二个。是否存在外部关键字只是为了让我感到困惑?

Mar*_*ith 11

LEFT JOIN并且LEFT OUTER JOIN是同义词,所以很抱歉,但听起来像是选项 2 :-)

“外部”连接(保留不匹配的行)与“内部”连接(没有)相反。

外连接有三种风格。Left、Right、Full(取决于要保留哪些不匹配的行)。

由于 SQL 没有用于任何其他类型的连接(例如左/右反半连接)的直接连接语法,因此允许OUTER关键字在语法中是可选的是没有歧义的。

LEFT ANTI SEMI JOIN听起来像你所期望的LEFT OUTER去做。您可以通过多种方式实现它。通常NOT EXISTS是首选,但您可以LEFT OUTER JOIN结合使用IS NULL以仅保留不匹配的那些。

这一切都在文档的“联接类型”部分得到确认

LEFT [ OUTER ]指定左表中不满足联接条件的所有行都包含在结果集中,并且将其他表的输出列设置为NULL除内联接返回的所有行之外。

周围的方括号[OUTER]只是表示这是可选的,但仍然适用相同的定义。