sql - 查询与自身连接的表

标签 sql join self-join ansi-sql

今天我有期末考试。我很高兴地批准了:D,但其中一个问题确实让我大吃一惊。

我需要帮助,这样我才能安心。

问题

我们有一个表“People”

(PK)id | name | fatherID
    ---------------------
    1  | gon  |   2
    2  | cesar|   6
    3  | luz  |   2
    4  | maria|   5
    5  | diego|   6
    6  | john |  -

这只是数据示例。 该表与其自身有关系,在表fatherId(FK)和表id(PK)上 我需要执行一个查询,显示 2 列,其中一列是一个人的名字,另一列是他/她的表弟。

到这里为止都很简单,对吧? 问题是我有一些限制

  • 仅允许 ANSI。没有 T-sql 或其他一种。另外,ANSI 99 标准,而不是 2003 或更高版本
  • 不允许子查询。最糟糕的是:
  • 没有重复的关系。

例如,在本例中,gon 和 maria 是表兄弟。 如果我展示,gon | maria 在结果中,我无法显示 maria |贡.

那么,我该怎么做呢? 真是让我头疼。

我尝试了什么?

嗯,最大的问题是最后一个必要条件,即数据的重复。忽略这一点,我把它放在我的考试中(知道是错误的..)

select p3.name as OnePerson, p4.name as Cousin
from
people p1
inner join people p2 on p1.fatherid = p2.fatherid and p1.id != p2.id
inner join people p3 on p1.id = p3.fatherid
inner join people p4 on p1.id = p4.fatherid

当然,这并没有解决最后一个要求,我的测试得了4分(我们以4分通过),但无论如何,我的头在燃烧。所以请帮助我!

探索了其他选项

我的一个 friend 也参加了同样的考试,他对我说

"Well, considering every relation is duplicated, I can use top count(*) and an order by and get the half correct"

但是..Top不是ANSI!

最佳答案

您可以在查询中添加 WHERE p3.id < p4.id 。这将消除重复的结果,例如 gon | mariamaria | gon .

关于sql - 查询与自身连接的表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16682499/

相关文章:

mysql - 标签数据库架构

MySql 使用嵌套查询检查最旧的记录与当前记录

sql - 逗号分隔的字符串与FK引用的内容

MySQL:错误消息无法创建表(errno:150)

php - 加入表后不从数据库中检索行

linux - 连接多个文本字段并保留所有内容..

MySQL 从组合的多个字段中获取 COUNT

Mysql连接同一个表中其他字段使用的多个ID(自连接)

mysql - 从具有类别的表中选择最小值和最大值

mysql - 查询长度限制