代码之家  ›  专栏  ›  技术社区  ›  Fabricio Araujo

Join子句以相同条件连接3个表

  •  0
  • Fabricio Araujo  · 技术社区  · 15 年前

    我看到过这样的连接:

    Select <blablabla>
    from 
      TableA TA
      Inner join TableB TB on Ta.Id = Tb.Id
      Inner join TableC TC on Tc.Id = Tb.Id and Ta.OtheriD = Tc.OtherColumn
    

    但是第二个连接子句的意义(结束效果)是什么?
    使用外部连接子句时的含义是什么?
    更重要的是,什么是最好的重写方式 想知道它想加入什么吗?
    而且,更重要的是,什么是最好的方法来重写它以摆脱构造 并保证查询的正确性。
    好奇(因为人们总是问):这是SQL Server 2005。

    编辑:这只是一个虚构的例子(因为我将不得不挖掘原始的来源-我已经没有访问权了)。我在10个连接上找到了原来的连接子句 选择 命令。

    4 回复  |  直到 15 年前
        1
  •  2
  •   Twelfth    15 年前

    你的问题:但是第二个连接子句的意义是什么?

    有效地过滤行…如果您真的需要,可以将on语句的后半部分移到where子句中,只会真正影响可读性。对于这个3表的例子,gbn的答案看起来不错,但是要扩展它……有时候这样的重写是不可能的。我见过两个不同的系统(一个oracle 8i和一个SQL server 2000)将它们的数据库连接在一起的情况。一个由3部分组成的键被确定为使记录在两个系统中都是唯一的,但是3部分键的每个组件都保存在不同的表中……最终结果有一些这样的连接。

    功能上…我不确定是否真的有区别。除非我完全离开,否则可读性似乎是最大的区别。

    你的第二个问题:当使用外部连接子句时会有什么影响?

    您可能会得到一堆空值(等待如何设置外部连接),而内部连接会丢弃它们。但是要小心…内部连接是关联的…正如gbn所说:外部连接不同,顺序也很重要

        2
  •  3
  •   gbn    15 年前

    这仅仅意味着你对tablea和tablec的交集有一个额外的限制。

    Ta.Id = Tb.Id , Tc.Id = Tb.Id Tc.Id = Ta.Id . 内部连接是关联的。所以这样更合理,所以每个连接只在两个表之间

    Select <blablabla>
    from 
      TableB TB 
      Inner join
      TableA TA on Tb.Id = Ta.Id   --a and b intersection
      Inner join
      TableC TC on Ta.Id = Tc.Id and Ta.OtheriD = Tc.Column   --a and c intersection
    
        3
  •  1
  •   Charles Bretana    15 年前

    用户可能希望进一步筛选包含在联接集中的行集。。。

        4
  •  0
  •   JNK    15 年前

    第二个连接的目的是根据TableC的内容进一步限制结果集。第一个连接只提供TA和TB中存在的记录。第二个连接只提供同样存在于TC中的第一个连接的结果。

    推荐文章