OMG*_*ies 59
内连接的反面是什么?
OUTER连接,可以有三种选择:
我想知道Person中的行有不好的AddrId,它们在Address表中没有行.
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)
SELECT p.*
FROM PERSON p
WHERE NOT EXISTS(SELECT NULL
FROM ADDRESS a
WHERE a.addrid = p.addrid)
Run Code Online (Sandbox Code Playgroud)
SELECT p.*
FROM PERSON p
WHERE p.addrid NOT IN (SELECT a.addrid
FROM ADDRESS a)
Run Code Online (Sandbox Code Playgroud)
内部联接不是外部联接的直径.它们用于不同的目的.但是,从一个表中查找另一个表中不存在的行的常见模式是使用外部联接:
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)
如果考虑内部连接为满足一定条件的两个表的行,则相反会在行任一台没有。
例如,以下将选择地址表中所有具有地址的人:
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)