Sql server Sql server-具有两个连接的内部连接语法

Sql server Sql server-具有两个连接的内部连接语法,sql-server,syntax,inner-join,Sql Server,Syntax,Inner Join,我注意到我们的一位程序员写了这样的话: SELECT * FROM Table_A A INNER JOIN Table_B B INNER JOIN Table_C C ON C.Id = B.Id ON B.Id = A.Id 我没想到这会起作用,但它确实会从我们的数据库返回结果 这与正常连接语法的工作原理相同吗?我找不到有关它的文档。是。我通常建议人们这样想,好像JOIN的作用与开始括号相同,ON的作用与结束括号相同。然后,用于括号匹配的常规规则会

我注意到我们的一位程序员写了这样的话:

SELECT * FROM Table_A A
  INNER JOIN Table_B B
    INNER JOIN Table_C C
      ON C.Id = B.Id
        ON B.Id = A.Id
我没想到这会起作用,但它确实会从我们的数据库返回结果


这与正常连接语法的工作原理相同吗?我找不到有关它的文档。

是。我通常建议人们这样想,好像JOIN的作用与开始括号相同,ON的作用与结束括号相同。然后,用于括号匹配的常规规则会告诉您哪个ON子句与哪个联接相关,并为您提供一些上下文来确定哪些表名/别名在范围内

所以这个查询有效地将表B连接到表C,然后将A连接到组合结果

如果纯粹使用内部联接,我通常不建议这样做——您可以轻松地重新排列表,以便遵循更正常的联接/打开/联接/打开模式。您从该查询1获得相同的逻辑结果:

请注意,如果您仔细阅读,以下内容将涵盖:

那么,在a中,左边是什么?任何右边是什么?任何事实上,这两者中的一个或两个都可以成为一个

你在问题中提到的正常形式是,如果我们只允许自己在另一个人的左手位置使用a,会产生什么后果


1尽管您依赖的是列顺序而不是列名,但由于使用SELECT*,列的顺序会有所不同。但是你不应该依赖列顺序。

是的。我通常建议人们这样想,好像JOIN的作用与开始括号相同,ON的作用与结束括号相同。然后,用于括号匹配的常规规则会告诉您哪个ON子句与哪个联接相关,并为您提供一些上下文来确定哪些表名/别名在范围内

所以这个查询有效地将表B连接到表C,然后将A连接到组合结果

如果纯粹使用内部联接,我通常不建议这样做——您可以轻松地重新排列表,以便遵循更正常的联接/打开/联接/打开模式。您从该查询1获得相同的逻辑结果:

请注意,如果您仔细阅读,以下内容将涵盖:

那么,在a中,左边是什么?任何右边是什么?任何事实上,这两者中的一个或两个都可以成为一个

你在问题中提到的正常形式是,如果我们只允许自己在另一个人的左手位置使用a,会产生什么后果


1尽管您依赖的是列顺序而不是列名,但由于使用SELECT*,列的顺序会有所不同。但是您不应该依赖列顺序。

是的,这与普通联接类似。SQL Server BibleYes一书对此进行了解释。这与普通联接类似。SQL Server Bible+1一书中对这些问题进行了解释,以反对OP问题中的语法。可读性对于任何协作软件项目来说都是至关重要的。此外,我以前还必须编写几十个+表连接语句,这样语法就不会扩展,除非您喜欢水平滚动条。+1用于反对OP问题中的语法。可读性对于任何协作软件项目来说都是至关重要的。此外,我以前还必须编写几十个+表连接语句,这样语法就不会扩展,除非您喜欢水平滚动条。
SELECT *
FROM Table_B B
INNER JOIN Table_C C
  ON C.Id = B.Id
INNER JOIN  Table_A A
  ON B.Id = A.Id
<table_source> ::=   
{  
    table_or_view_name [ [ AS ] table_alias ]   
        [ <tablesample_clause> ]   
        [ WITH ( < table_hint > [ [ , ]...n ] ) ]   
    ...
    | <joined_table>
    ...
<joined_table> ::=   
{  
    <table_source> <join_type> <table_source> ON <search_condition>
    ...