【问题标题】:SQL Server - Join Question - 3 tablesSQL Server - 连接问题 - 3 个表
【发布时间】:2011-01-31 17:26:37
【问题描述】:

考虑MSDN documentation的例子:

SELECT p.Name, pr.ProductReviewID
FROM Production.Product p
LEFT OUTER JOIN Production.ProductReview pr
ON p.ProductID = pr.ProductID

在此示例中,很明显左侧上的表是“Production”,所有行都将从那里返回,然后只返回与 ProductReview 匹配的行。

但现在考虑以下假设查询,其中包含 3 个表 A、B、C

select * from A
inner Join B on A.field1 = B.field1
left outer join C on C.field2 = b.Field2

此查询中的左表是哪一个(无论与 C 是否匹配,都将从该表返回所有记录)?是A还是B?还是 A & B 连接的结果?

我的困惑来自以下MSDN documentation,它指出“只能在 FROM 子句中指定外连接”,这意味着我假设查询中的左表是 A,但是我没有 ON 子句指定连接条件 - 在这种情况下,我的假设查询是一个错误的查询吗?

【问题讨论】:

    标签: sql-server join left-join


    【解决方案1】:

    由于 A 和 B 之间存在 INNER JOIN,因此只有 B 中与 A 匹配的行才有资格进行到 C 的 LEFT JOIN。

    【讨论】:

      【解决方案2】:

      我不是 100% 确定我理解你的问题,但假设我理解正确:

      假设查询中的“左”表是 B,因为您的 ON 条件指定了 B.Field2。

      【讨论】:

        【解决方案3】:

        术语“左”和“右”在此上下文中不够具体。相反,您应该使用术语“保留”和“未保留”。因此,表 A 和 B 被保留,表 C 未保留.

        MSDN 文档中的引用意味着您不能在子查询之外的 Select、Where、Group By、Having 或 Order By 子句中使用连接(外部或其他方式)(它们仍在 From 子句中) .

        【讨论】:

          【解决方案4】:

          来自你的加入

          A inner Join B on A.field1 = B
          left outer join C on C.field2 = b.Field2 
          

          您需要有来自表AB 的记录。 左连接只有来自表C 字段field2 的数据与B 表匹配,但请注意表A field2 不必匹配。

          要查看表 C 的数据,请运行以下命令:

          select c.*
          from A inner Join B on A.field1 = B.field1 left outer join C on C.field2 = b.Field2 
          

          【讨论】:

            【解决方案5】:

            他们在一般(广义)意义上使用术语FROM 子句,意思是查询的整个部分,从关键字FROM 开始,包括所有的连接。

            这是一个更完整的上下文(注意上一句):

            可以在 FROM 或 WHERE 子句中指定内连接。 外连接只能在 FROM 子句中指定。

            看到了吗?它们意味着您不能像内部联接那样在 WHERE 子句中指定外部联接。您只能在 FROM 子句中执行此操作(也就是说,在许多其他连接之后)。结果将应用于先前连接的结果。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2010-11-19
              • 1970-01-01
              相关资源
              最近更新 更多