当前位置: 首页 > 面试题库 >

左外部联接是关联的吗?

冉伯寅
2023-03-14
问题内容

很容易理解为什么左外部联接不是可交换的,但是我很难理解它们是否是可交换的。几家在线资源表明不是,但我还没有说服自己就是这种情况。

假设我们有三个表:A,B和C。

令A包含ID和B_ID两列,其中ID是表A的主键,B_ID是与表B的主键相对应的外键。

令B包含两列ID和C_ID,其中ID是表B的主键,C_ID是与表C的主键相对应的外键。

让C包含ID和VALUE两列,其中ID是表C的主键,而VALUE仅包含一些任意值。

那不(A left outer join B) left outer join C应该等于A left outer join (B left outer join C)吗?


问题答案:

正如您的问题似乎暗示的那样,如果您假设要联接外键,那么可以,我认为OUTER JOIN可以保证是关联的,如Przemyslaw
Kruglej的答案
所涵盖。

但是,鉴于您实际上尚未指定JOIN条件,因此从理论上讲,正确的答案是不,不能保证它们是关联的。有两种简单的方法可以违背带有反常ON子句的关联性。

1. JOIN条件之一涉及所有3个表中的列

这是一种违反关联性的廉价方法,但是严格来说,您的问题中没有任何内容可以禁止它。使用问题中建议的列名,考虑以下两个查询:

-- This is legal
SELECT * FROM (A JOIN B ON A.b_id = B.id) 
              JOIN C ON (A.id = B.id) AND (B.id = C.id)


-- This is not legal
SELECT * FROM A
              JOIN (B JOIN C ON (A.id = B.id) AND (B.id = C.id))
              ON A.b_id = B.id

最底下的查询甚至不是有效的查询,但最顶上的查询是。显然,这违反了关联性。

2.尽管一个表中的所有字段均为NULL,但仍可以满足JOIN条件之一

这样,根据JOIN的顺序,我们甚至可以在结果集中拥有不同数量的行。例如,让在B上加入A的条件为A.b_id = B.id,但在C上加入B的条件为B.id IS NULL

因此,我们得到了这两个查询,它们的输出截然不同:

SELECT * FROM (A LEFT OUTER JOIN B ON A.b_id = B.id) 
              LEFT OUTER JOIN C ON B.id IS NULL;


SELECT * FROM A 
              LEFT OUTER JOIN (B LEFT OUTER JOIN C ON B.id IS NULL)
              ON A.b_id = B.id;

您可以在这里看到实际的效果:http :
//sqlfiddle.com/#!9/d59139/1



 类似资料:
  • 问题内容: 我有一个网站,用户可以在其中查看电影列表,并为其创建评论。 用户应该能够看到所有电影的列表。此外,如果他们查看了电影,则他们应该能够看到他们给它的评分。如果不是,则仅显示没有得分的电影。 他们根本不在乎其他用户提供的分数。 考虑以下 我本质上想要的是 考虑以下内容: 两个测试都应打印完全相同的输出,但是,只有原始版本会吐出正确的结果表: orm会返回这个 任何试图加入其余主题的尝试,那

  • 问题内容: 这个问题已经在这里有了答案 : SQL中左右联结与左右联结之间的区别[重复] (4个答案) 6年前关闭。 我看到过称为LEFT OUTER JOIN或RIGHT OUTER JOIN的联接。在某些地方,我见过LEFT JOIN或RIGHT JOIN。我对此感到困惑。 我两天前发布了一个问题,但我无法理解解决方案提供的链接。 这些连接类型是否相同,或者两者之间有区别? 问题答案: 两者之

  • 我正在尝试JPA2.1(eclipselink)中的“treat as”函数,但遇到了一个来自JPA的错误: 异常说明:ReportQuery结果大小不匹配。应为[263],但已检索到[197] 下面是我的JPQL查询(我更改了一些部分,以便更明确): 我们可以看到account和ad_account之间的左外部连接。此外,ad_account表不存在于select子句中。(idApp字段是主键的

  • 问题内容: 我有这些表, 和。我想执行左外部联接。 劳斯莱斯 推出 SUMing,JOINing和GROUPings之后的预期输出==> 我的代码: 但是上面代码的O / P是 我不知道我要去哪里错了-你能解释一下吗? 问题答案: 您没有做错任何事。这就是JOIN的行为 它是左边的行数X右边的行数,在您的情况下为3 x 2 = 6。 试试这个 SQLFiddle 我知道这不适用于SQL Serve

  • 问题内容: 我不了解左外部联接,右外部联接的概念,或者根本不理解为什么我们需要使用联接!我正在努力解决的问题以及正在处理的表格在这里:链接 问题3(b) 在SQL中构造命令以解决以下查询,解释了为什么必须使用(外部)联接方法。[5分]“找到每名工作人员及其his属(如果有)的姓名” 问题3(c)- 使用(i)join方法和(ii)子查询方法在SQL中构造命令以解决以下查询。[10分]“查找在计算机

  • 现在表1和表2没有使用外键的直接关系。对应的JPA实体如下所示: 我的代码看起来像: 则尝试使用以下方法获取值: Table2有大约6列带有@id注释,而我不能将它更改为只有两列带有@id注释。 请告诉我: > 如果有可能为我的方法1(select子句中的子查询)使用CriteriaBuilder编写代码。 请注意,我使用的是普通的JPAAPI。DB是Oracle11g。JDK版本为1.7。