【问题标题】:Join clause joining 3 tables in same criteriaJoin 子句以相同的条件连接 3 个表
【发布时间】:2010-10-06 18:07:53
【问题描述】:

我见过这样的连接:

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

但是第二个连接子句的意义(最终效果)是什么?
使用外连接子句时的含义是什么?
而且,更重要的是,以简单的方式重写它的最佳方法是什么? 了解它试图加入什么?
而且,更重要的是,重写它以摆脱构造的最佳方法是什么 并保持查询的正确性。
我没有指定 RDBMS,因为这是一个更通用的问题,但对于那些 好奇(因为人们总是问):这是 SQL Server 2005。

编辑:这只是一个虚构的例子(因为我必须挖掘原始来源 - 我不再有权访问)。我在 10 join SELECT 命令上找到了原始的连接子句。

【问题讨论】:

    标签: sql join


    【解决方案1】:

    这只是意味着您对 tablea 和 tablec 之间的交集有额外的限制。

    因为我们知道Ta.Id = Tb.IdTc.Id = Tb.IdTc.Id = Ta.Id 相同。内连接是关联的。所以这样更有意义,所以每个连接只在 2 个表之间

    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
    

    【讨论】:

    • 似乎我必须重新排序连接才能消除“ON”子句中的两个表条件。嗯
    • @Fabricio Araujo:它是相同的 JOIN,并且会给出相同的结果,因为“INNER JOIN”是关联的和可交换的。我希望澄清你的情况。
    • 阅读编辑。只是为了举例,它是编造的。它可能是一个外部连接。我只是使用了内部连接——我只是想了解摆脱这种结构的效果和最好的(不太危险的)方法。
    • @Fabricio Araujo:OUTER JOIN 不同,顺序很重要。你有 3 个相似的答案:你到底在问什么?
    • 对不起,我同意我不清楚。我重写了部分问题,希望这次我做对了。
    【解决方案2】:

    您的问题:但是第二个连接子句的意义(最终效果)是什么?

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

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

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

    您可能会得到一堆空值(取决于您如何设置外连接),而内连接会删除它们。不过要小心……内连接是关联的……正如 gbn 所说:外连接是不同的,顺序很重要

    【讨论】:

      【解决方案3】:

      用户可能想要进一步过滤加入集合中包含的行集...

      【讨论】:

        【解决方案4】:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2021-09-28
          • 2015-05-02
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2023-02-08
          相关资源
          最近更新 更多