我最近看到了这个查询,它查找了客户端可以访问的所有方:
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
条款中得到这个逻辑。
LEFT JOIN
返回第一个表中的所有行 - 即使第二个表中没有匹配项也是如此。
因此,这将返回前面表格中的所有行 - 以及来自Client
的ClientId = 1
中的所有行。如果ClientId
上没有匹配,则列将为NULL
,但不会过滤行。
如果您与其他方法进行比较,这只能是好/坏的做法。将测试放在左边的连接中和两个不同的东西 - 所以这不是好/坏练习的问题。
如果这是正确的左连接条件,意味着您希望该条件上的内连接行加上不匹配的左表行,那么这就是左连接条件。它不会去其他任何地方。
了解连接返回的内容:行上的内连接加上由空值扩展的不匹配的左表行。始终知道您想要的内连接作为左连接的一部分。
那是真实的。左连接一个特定的值是非常糟糕的做法。但有时候,我们可能需要从一个表中的所有列,尽管我们没有要加入的公共列,并且需要按特定条件加入,例如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)