【问题标题】:Finding grand parents of children寻找孩子的祖父母
【发布时间】:2021-07-03 22:01:19
【问题描述】:

这几天我试图了解内部连接的工作原理。

我有两个简单的表格(家庭债券):

  1. “人”(id、fname、lname)
  2. “关系”(父/子)

我学会了如何让所有孩子的父母

SELECT p.firstname, p.lastname, c.firstname, c.lastname  
FROM persons p
INNER JOIN relationships ON p.id = relationships.parent 
INNER JOIN persons c     ON c.id = relationships.child;

让所有孩子的祖父母怎么样?

这只是对该查询的调整还是涉及更多? 在我看来,我应该将相同的查询应用于查询(一次递归),但我不知道如何。

感谢您的指导。

PS:内部连接在纸上很容易理解,但对我来说很难使用,因为我习惯于使用程序算法来创建脚本,但内部连接根本不是程序化的,它们应该是接近。所以我正在尝试分析用例以适应它们

【问题讨论】:

标签: sql foreign-keys inner-join


【解决方案1】:

让所有孩子的祖父母怎么样?

首先是您的查询,但使用更好的关系名称:

SELECT p.firstname, p.lastname, c.firstname, c.lastname  
FROM 
  relationships p_c 
  INNER JOIN persons p ON p.id = p_c.parent 
  INNER JOIN persons c ON c.id = p_c.child;

然后要获得祖父母:孩子,您必须通过父母进行路由:

SELECT p.firstname, p.lastname, c.firstname, c.lastname  
FROM 
  relationships p_c 
  INNER JOIN relationships gp_p ON gp_p.child = p_c.parent --in a grandparent:parent relationship the child of the grandparent, is the parent of the grandchild in the parent:child
  INNER JOIN persons gp ON gp.id = gp_p.parent --parent = the grandparent
  INNER JOIN persons c ON c.id = p_c.child;    --child = the grandchild

不确定我是否会选择这个示例来学习内部连接。此外,如果将关系列称为其他名称,例如 elderyounger ,可能会更容易考虑:)

【讨论】:

  • 非常感谢凯厄斯。并感谢您提供了很多帮助的 cmets!在我的问题中,我需要每个孙子将他的 4 GP 列在与他的同一行中(1 行 = GC+GP1+GP2+GP3+GP4)。它是否完全改变了查询,因为选择可能必须是“SELECT c.fname, c.lname, gp1.fname, gp1.lname, gp2.fname, gp2.lname, gp3.fname, gp3.lname, gp4.fname, gp4.lname”?再次,非常感谢,这有很大帮助。 (是的,它很先进,但我需要这些用例来了解全局)。我将重命名我的列,以便更清晰,你是对的。
  • 你的意思是4级血统吗?或者你的意思是4个祖父母?对于任何给定的孩子,您的查询应该产生 4 行,每个祖父母一行(假设 2 个男性行,2 个女性行)。如果您希望将它们作为列,那就是一个枢轴操作
  • 4 个祖父母(当然如果有 4 个祖父母)和他们的孙子在同一排。像这样:“孙子 I GP1 I GP2 I GP3 I GP4”。它不必按性别分组,只有前 4 个 GP 按照他们的 ID 顺序排列。内连接还不够吗?子查询有帮助吗?谢谢凯厄斯。
  • 将它们全部放在一条线上实际上是相当棘手的,并且在内部连接的上下文中可能不是一个很好的学习练习。最好将其作为一个单独的问题提出,因为它需要一大块不适合评论的代码。我建议将此问题标记为已回答(单击我的答案旁边的灰色复选标记),然后提出另一个问题(使用此问题中的代码、它给出的结果和所需的输出)。还要说明您正在使用什么数据库软件。我怀疑我们最终会对 row_number 进行条件聚合
  • 如果你知道组,你可以这样做。链接到您提出的新问题,我将演示
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-08-30
  • 2017-08-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多