Where 和 Join on Id 之间的区别

Difference between Where and Join on Id

我最近看到这个查询,它找到了客户可以去的所有派对:

SELECT *
FROM Party
    INNER JOIN Organizer on Organizer.OrganizerId = Party.OrganizerId
    LEFT JOIN Client on Client.ClientID = 1
    LEFT JOIN PartyRegistration on PartyRegistration.PartyId = Party.PartyId
WHERE Party.OrganizerId = 0
    AND (Party.HasGuestList = 0 OR PartyRegistration.ClientId = Client.ClientId)

我以前从未见过特定值的联接。看到这样的 SQL 代码正常吗?

我对左连接知之甚少,但它可以应用于任何连接,例如,这将如何:

SELECT *
FROM Party
    INNER JOIN Organizer on Organizer.OrganizerId = 0

与那个比较,因为结果相同:

SELECT *
FROM Party
    INNER JOIN Organizer on Organizer.OrganizerId = Party.OrganizerId
WHERE Organizer.OrganizerId = 0

这是很好的做法——事实上,您不能(轻易地)在 WHERE 子句中获得此逻辑。

A LEFT JOIN returns 第一行中的所有行 table -- 即使第二行中没有匹配项。

因此,这 returns 前面 table 中的所有行 -- 以及 ClientClientId = 1 中的任何行。如果 ClientId 没有匹配项,则列将为 NULL,但不会过滤行。

没错。左连接特定值是非常糟糕的做法。但有时,我们可能需要一个 table 中的所有列,尽管我们没有要连接的公共列并且需要按 A="some value" 等特定条件连接。在这种情况下,在特定条件下添加 LEFT JOIN 是不好的做法,虽然我们没有更好的方法,但下面是更新的代码,如果您有任何问题,请告诉我,我很乐意为您提供帮助。

SELECT *
FROM Party
    INNER JOIN Organizer on Organizer.OrganizerId = Party.OrganizerId
    LEFT JOIN Client USING(CLIENTID)
    LEFT JOIN PartyRegistration on PartyRegistration.PartyId = Party.PartyId
WHERE CLIENTID=1 AND Party.OrganizerId = 0
    AND (Party.HasGuestList = 0 OR PartyRegistration.ClientId = Client.ClientId)

如果您与替代方案进行比较,这只能是 good/bad 练习的问题。在左连接和 where 中进行测试会做两件不同的事情——所以这不是 good/bad 实践的问题。

如果那是 正确的 左连接条件,这意味着您希望该条件下的内部连接行加上不匹配的左 table 行,那么这就是左连接条件.它不会去其他任何地方。

了解 returns 上的左连接:行上的内连接加上由空值扩展的不匹配的左 table 行。始终知道您想要什么内部联接作为左联接的一部分。