Sql Id上的Where和Join之间的差异

Sql Id上的Where和Join之间的差异,sql,join,syntax,left-join,where,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.

我最近看到了这个查询,它发现所有甲方客户都可以访问:

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”)进行连接。在这种情况下,在特定条件下添加左连接是一种不好的做法,虽然我们可以用更好的方式,但下面是更新的代码,如果您有任何问题,请告诉我,我很乐意在这方面帮助您

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)

如果与其他方法相比,这只能是一个好的/坏的做法。将测试放在vs a的左连接中,其中有两个不同的功能——因此这不是一个好/坏实践的问题

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


了解返回的左联接:行的内部联接加上由null扩展的不匹配的左表行。始终知道作为左连接的一部分,您需要什么样的内部连接。

这是否意味着删除
WHERE Party.OrganizerId=0
也是一种良好的做法,而不是将id置于
内部连接的
条件下?@Halhex这不是一个良好的做法,而是一个正确或错误的结果。在所有左连接之后使用内部连接,您可以选择将测试放在或放在何处,因此坏/好的实践变得相关。阅读答案的第一行。(看看我的答案。)@Halhex。这是风格问题。我想大多数人会把过滤条件放在
where
子句中。
on
子句中的过滤不同——如果将条件移动到
位置,则会更改结果。尝试使用
使用
时,我会收到此错误消息ClientId不是可识别的表提示选项。如果要将其用作表值函数或CHANGETABLE函数的参数,请确保数据库兼容模式设置为90。我的错误,我没有添加表别名。尝试这样做,Client.clienti还会出现一个错误,即在上下文中指定了一个非布尔类型的表达式,其中使用
中需要一个条件。如果这是左连接条件,则表示他们希望该条件上的内部连接行加上不匹配的左表行,那就是左连接条件。那是什么意思??与身份证处于where状态相比,正如问题所暗示的,“坏习惯”与什么相比?“将id置于where条件下”会产生一些不同的效果,因此,如果将id置于on状态是正确的,那么将id置于where状态将是错误的,因此where甚至不是一个选项。为什么它是在on中——这样我们就可以与实际选项进行比较——可以做任何你想做的事情的替代方案。这是如何回答我的问题的?这是“了解返回时的左联接:行上的内部联接加上由null扩展的不匹配的左表行”尝试解释左联接吗?“始终知道作为左连接的一部分,您想要什么样的内部连接”是什么意思?为什么你这么坚持,却毫无意义?你最初的问题涉及左撇子。你不明白它是怎么工作的,否则你就不会问你的问题。所以我告诉你们要找出答案,并给出一个快速但正确的定义。从给出的定义可以清楚地看出,因为它是在内部联接方面,您需要知道与外部联接相关联的内部联接;我只是强调一下。您添加的代码是关于vs where上的内部连接。它提出的问题与你答案的第一部分不同。你花了很多无益的时间抱怨,而不是试图理解我想要表达的内容。要理解你的答案,需要事先了解我误解的内容。这是无益的。虽然我现在可以看到混淆,因为我确实认为在一个where中移动
on
条件是相同的,无论连接类型如何,我不认为这个答案实际上对这个问题有用。主要是看Gordon的答案,这些都是真实的答案。我的“抱怨”是我试图理解的,如果是说我应该去别的地方看看,为什么还要回答呢?这只能是一个好的/坏的做法,如果你与另一个选择相比较的话。将测试放在vs a的左连接中,其中有两个不同的功能——因此这不是一个好/坏实践的问题。这可能是一个错误。如果您想了解备选方案,请给出一个示例。但是如果是这样的话,首先谷歌FAQ会在vs a where的左连接中重新进行测试。你的评论有什么意义?再说一遍--“正常”意味着什么--达到什么?你已经得出了一个结论,或者没有用“坏”的措辞问你想问的问题--除非有其他选择,否则不可能有坏习惯。想想你真正想问的问题。你添加的代码从左连接切换到内连接。它做了一些不同的事情。它提出了一个不同的问题。如果你不明白连接是如何工作的,请研究一下,如果你被卡住了,问一个关于理解一些权威性陈述的问题。vs上的内部联接的PS,其中