在哪里和加入ID之间的区别

时间:2019-04-01 17:09:42

标签: sql join syntax left-join where

我最近看到了这个查询,该查询找到了客户可以参加的所有聚会:

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

3 个答案:

答案 0 :(得分:2)

这是非常好的做法-实际上,您不能(轻松)在WHERE子句中获得此逻辑。

LEFT JOIN返回第一个表中的所有行-即使第二个表中没有匹配项。

因此,这将返回先前表中的所有行-以及ClientClientId = 1的任何行。如果该ClientId上没有匹配项,则列将为NULL,但行不会被过滤。

答案 1 :(得分:1)

与其他方法相比,这只能是一种好/不好的做法。将测试放在左连接与vs上有两个不同的地方-因此,这不是好/坏做法的问题。

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

了解返回时左联接的内容:行的内部联接加上不匹配的左表行(扩展为null)。始终知道要作为左联接的一部分的内部联接。

答案 2 :(得分:-1)

是的。对特定的值进行左联接确实是不好的做法。但是有时,我们可能需要一个表中的所有列,尽管我们没有要连接的公共列,并且需要通过特定条件(例如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)