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

有关左外部联接和条件的SQL标准

拓拔弘扬
2023-03-14
问题内容

我在基于放置过滤条件的位置的查询中基于过滤条件得到不同的结果。我的问题是:

  • 这些查询之间在技术上有区别吗?
  • SQL标准中是否有任何内容可以解释与查询不同的记录集?

在简化的情况下:

--Table: Parent  Columns: ID, Name, Description
--Table: Child   Columns: ID, ParentID, Name, Description

--Query 1
SELECT p.ID, p.Name, p.Description, c.ID, c.Name, c.Description
FROM   Parent p
   LEFT OUTER JOIN Child c ON (p.ID = c.ParentID)
WHERE  c.ID IS NULL OR c.Description = 'FilterCondition'

--Query 2
SELECT p.ID, p.Name, p.Description, c.ID, c.Name, c.Description
FROM   Parent p
   LEFT OUTER JOIN Child c
   ON (p.ID = c.ParentID AND c.Description = 'FilterCondition')

我以为查询将返回相同的结果集,而当它们没有返回时,我感到很惊讶。我使用的是MS
SQL2005,在实际查询中,查询1返回了约700行,查询2返回了约1100行,但我无法检测到返回行和排除行的模式。查询1中仍然有许多行,其中子行包含数据和NULL数据。我更喜欢查询2的样式(并且我认为它是最佳选择),但是我认为查询将返回相同的结果。

编辑/摘要:

这里提供了一些很好的答案。我很难选择授予谁答案。我决定选择mdma,因为它是第一个答案,也是最清晰的答案。根据提供的答案,以下是我的摘要:

可能的结果:

  • 答:没有孩子的父母
  • B:有孩子的父母
  • |-> B1:有孩子的父母, 没有孩子与 过滤器 匹配
  • \-> B2:有1个或多个与过滤器匹配的孩子的父母

查询结果:

  • 查询1返回(A,B2)
  • 查询2返回(A,B1,B2)

由于左连接,查询2始终返回父级。在查询1中,WHERE子句是在左联接之后执行的,因此排除了没有子项与过滤器匹配的子项的父项(情况B1)。

注意:在情况B1中仅返回父信息,在情况B2中仅返回与过滤器匹配的父/子信息。

HLGEM提供了一个很好的链接:

http://wiki.lessthandot.com/index.php/WHERE_conditions_on_a_LEFT_JOIN


问题答案:

第一个查询将返回父级没有子级或某些子级与过滤条件匹配的情况。具体而言,将省略父母有一个孩子但不符合过滤条件的情况。

第二个查询将为所有父母返回一行。如果过滤条件不匹配,则将为所有c列返回NULL。这就是为什么您在查询2中获得更多行的原因-
带有不符合过滤条件的子项的父项输出为NULL子值,在第一个查询中将其过滤掉。



 类似资料:
  • 问题内容: 很容易理解为什么左外部联接不是可交换的,但是我很难理解它们是否是可交换的。几家在线资源表明不是,但我还没有说服自己就是这种情况。 假设我们有三个表: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的主键

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

  • 我需要从中选择所有行,如果选择位置子句匹配,则从中选择匹配这是我的外部与子查询,但它失败了。有人可以帮忙吗?

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

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

  • 问题内容: 我在SQL中有此查询,并且希望它使用Entity Framework 在LINQ中实现它,但是如何应用左外部联接的多个表? 问题答案: 这是使用LINQ实现左外部联接的方式。您应该使用GroupJoin(语法): 该查询联接了三个表。您可以以相同的方式加入其余表。