寻找孩子的祖父母
Posted
技术标签:
【中文标题】寻找孩子的祖父母【英文标题】:Finding grand parents of children 【发布时间】:2021-07-03 22:01:19 【问题描述】:这几天我试图了解内部连接的工作原理。
我有两个简单的表格(家庭债券):
-
“人”(id、fname、lname)
“关系”(父/子)
我学会了如何让所有孩子的父母
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:内部连接在纸上很容易理解,但对我来说很难使用,因为我习惯于使用程序算法来创建脚本,但内部连接根本不是程序化的,它们应该是接近。所以我正在尝试分析用例以适应它们
【问题讨论】:
CROSS JOIN vs INNER JOIN in SQLRe SQL querying.Re relational querying.Null in Relational AlgebraWhat to do with null values when modeling and normalizing? How to get matching data from another SQL table for two different columns: Inner Join and/or Union? What is a self join for? (in english) PS 找出什么是子查询以及当串行连接不足时如何嵌套查询。 【参考方案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
不确定我是否会选择这个示例来学习内部连接。此外,如果将关系列称为其他名称,例如 elder
和 younger
,可能会更容易考虑:)
【讨论】:
非常感谢凯厄斯。并感谢您提供了很多帮助的 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 进行条件聚合 如果你知道组,你可以这样做。链接到您提出的新问题,我将演示以上是关于寻找孩子的祖父母的主要内容,如果未能解决你的问题,请参考以下文章