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 中的所有行 -- 以及 Client
中 ClientId = 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 行。始终知道您想要什么内部联接作为左联接的一部分。
我最近看到这个查询,它找到了客户可以去的所有派对:
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 中的所有行 -- 以及 Client
中 ClientId = 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 行。始终知道您想要什么内部联接作为左联接的一部分。