内联的对面

fas*_*ava 18 sql database

内连接的反面是什么?对于表表Person (int PersonId, varchar PersoName, int AddrId),我想知道Person中AddrId的行与Address表中没有行的行.

OMG*_*ies 59

内连接的反面是什么?

OUTER连接,可以有三种选择:

  • 剩下
  • 充分

这是JOIN的良好直观表示

我想知道Person中的行有不好的AddrId,它们在Address表中没有行.

使用LEFT JOIN/IS NULL

   SELECT p.*
     FROM PERSON p
LEFT JOIN ADDRESS a ON a.addrid = p.addrid
    WHERE a.addrid IS NULL
Run Code Online (Sandbox Code Playgroud)

使用NOT EXISTS

SELECT p.*
  FROM PERSON p
 WHERE NOT EXISTS(SELECT NULL
                    FROM ADDRESS a
                   WHERE a.addrid = p.addrid)
Run Code Online (Sandbox Code Playgroud)

使用NOT IN

SELECT p.*
  FROM PERSON p
 WHERE p.addrid NOT IN (SELECT a.addrid
                          FROM ADDRESS a)
Run Code Online (Sandbox Code Playgroud)

  • +1表示完整性,用于回答如何在人员中找到包含错误AddrId的行.OTOH,我不认为外连接是_opposite_内连接.只是不同. (3认同)

Tho*_*mas 7

内部联接不是外部联接的直径.它们用于不同的目的.但是,从一个表中查找另一个表中不存在的行的常见模式是使用外部联接:

Select ...
From Table1
    Left Join Table2
        On Table2.ForeignKeyCol = Table1.PrimaryKeyCol
Where Table2.PrimaryKeyCol Is Null
Run Code Online (Sandbox Code Playgroud)

这将返回Table1中的所有行以及Table2中的所有匹配行,这样,如果给定的Table1行没有Table2匹配,则返回Table2列的null.然后要求非可空列(Table2.PrimaryKeyCol)为空,我将从Table1获取Table2中不存在的所有行.使用您的示例表名称,我们会有类似的东西:

Select ...
From Person
    Left Join Address
        On Address.PersonId = Person.Id
Where Address.Id Is Null
Run Code Online (Sandbox Code Playgroud)


Zug*_*alt 5

如果考虑内部连接为满足一定条件的两个表的行,则相反会在行任一台没有。

例如,以下将选择地址表中所有具有地址的人:

SELECT p.PersonName, a.Address
FROM people p
JOIN addresses a
    ON p.addressId = a.addressId
Run Code Online (Sandbox Code Playgroud)

我想这的“对立面”是选择所有没有地址的人和所有没有人的地址。但是,这似乎并不是您要的,您似乎只对其中的一个组件感兴趣:地址表中没有地址的所有人员。

为此,最好使用左连接:

SELECT p.PersonName
FROM people p
LEFT JOIN addresses a
   ON p.addressId = a.addressId
WHERE a.addressId IS NULL
Run Code Online (Sandbox Code Playgroud)

请注意,通常有些人倾向于以不同的方式编写它,因为他们认为它更具可读性(但是,根据我对大型表的经验,它的性能比上述方法差):

SELECT PersonName
FROM people
WHERE addressId NOT IN (SELECT addressId FROM addresses)
Run Code Online (Sandbox Code Playgroud)