我最近看到了这个查询,该查询找到了客户可以参加的所有聚会:
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
答案 0 :(得分:2)
这是非常好的做法-实际上,您不能(轻松)在WHERE
子句中获得此逻辑。
LEFT JOIN
返回第一个表中的所有行-即使第二个表中没有匹配项。
因此,这将返回先前表中的所有行-以及Client
中ClientId = 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)