【问题标题】:How to understand this query?如何理解这个查询?
【发布时间】:2019-07-10 22:27:23
【问题描述】:
SELECT DISTINCT
    ...
    ...
    ...
FROM Reviews Rev
    INNER JOIN Reviews SubRev ON Subrev.W_ID=Rev.ID
WHERE Rev.Status='Approved'

这是我已经尝试理解了一天的长查询的一小部分。加入发生了什么?评论表似乎以不同的别名与自身连接。为什么这样做?它实现了什么?此外,对于仍然选择并返回的条目,Reviews 表的 ID 字段为空。这是正确的,但我不明白如果 W_ID 字段不为空,会发生这种情况。

【问题讨论】:

  • 将一个表连接到自身是完全正常的。在这种情况下,有一个W_ID 充当主评论的“子评论”。此查询查找该 SubReview 并返回其信息。
  • 并且“评论表的ID字段对于条目来说是空的”...这条评论适用于评论表的哪个实例? Rev 还是 SubRev?我们不知道您在查询中选择了哪些字段,也不知道源数据究竟是什么样的。
  • @ADyson 谢谢,你的 cmets 解释了很多。
  • (显然--)这是一个常见问题解答。在考虑发布之前,请始终在谷歌上搜索任何错误消息以及您的问题/问题/目标的许多清晰、简洁和准确的措辞,包括和不包括您的特定字符串/名称;阅读许多答案。如果您发布问题,请使用一个短语作为标题。请参阅How to Ask 和投票箭头鼠标悬停文本。 PS 请参阅我对已接受答案的评论问题。另请参阅我在链接副本中的答案。另请参阅许多其他重复项。 PS 要具体询问您不了解的内容,请查看一般重复项,然后解释您的期望,以便我们解决。

标签: sql oracle self-join


【解决方案1】:

它允许您将表中的一行连接到表中的另一行。

我已经看到了这一点,并自己使用它,以防您可能在这些行之间存在关系。

现实世界的例子:

  • 记录的旧版本和新版本
  • 某种层次关系(例如,如果表包含人员记录,您可以记录某人是其他人的父母)。可能还有很多其他可能的用例。

SQL 允许您创建在同一个表中的两个不同列之间关联的外键。

【讨论】:

  • “允许您将表中的一行连接到表中的另一行”不是完整的描述或有用的表征。我们可能想要一行与自身配对。更正这一点,我们得到“允许您将表中的一行连接到表中的一行”......因为我们已经知道我们正在将一个表连接到自身,所以这是一个没有信息的重言式。此外,tables 表示关系,对表的关系操作返回表示关系的表。 (根据关系运算符对应的每个逻辑运算符的输入关系构建。)
  • @philipxy “我们可能想要一行与自身配对” ...可能是的。你能想到一个用例吗?如果您认为可以更好地解释它,请随时添加新答案。就个人而言,我无法对您充满行话的解释做出头或尾(我以前见过其中的一些)。毫无疑问,它们在学术上是正确的,但我不确定您上面关于表格和关系的性质的评论是否能为 OP 提供任何实际帮助。我认识的谁为实际使用实现了关系数据库,没有人使用这些术语讨论他们的模式,但这并没有阻止他们产生有用的工作。
  • 是的,几乎总是人们无法证明他们的编码符合规范和/或无法编写和/或阅读精确的规范,但不幸的是,编程文化就是这样。但是,如果您想了解如何,那么您可以从努力理解我在重复链接上的答案开始。 (这个问题有很多重复,所以应该关闭而不回答。)
  • PS 交叉连接与自身匹配一行,内连接是满足进一步条件的交叉连接行,因此每个交叉和内连接都可以认为是与自身配对的行。但是行差异无关紧要,寻找用例没有抓住重点。如果您阅读我对重复链接的回答,您会看到我们自加入以使用具有不同参数列表/集的表的成员资格标准。
  • @philipxy “寻找用例没有抓住重点” ...是吗? OP 专门询问它取得了什么成就。在实际意义上,将一行加入自身会实现什么?我想不出一个案例
猜你喜欢
  • 2013-09-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多