查询与自身连接的表

时间:2013-05-22 02:26:04

标签: sql join self-join ansi-sql

今天我有一个期末考试。我高兴地批准了:但是其中一个问题真的让我大吃一惊。

我需要帮助,所以我可以安息。

问题

我们有一张桌子“人物”

(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或更高
  • 不允许使用subquerys。最糟糕的是:
  • 没有关系重复。

例如,考虑到这个例子,gon和maria是堂兄弟。 如果我在结果中显示gon | maria,则无法显示maria | gon

那么,我怎么能这样做? 真是在烧我的脑袋。

我尝试了什么?

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

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分),但无论如何,我的脑袋正在燃烧。所以,请帮助我!

探索了其他选项

我的一个朋友,也有同样的考试说我

  

“好吧,考虑到每个关系都是重复的,我可以使用top   count(*)和一个order by得到正确的一半“

但.. Top不是ANSI

3 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:0)

这会以您想要的格式提供结果。

SELECT TAB1.ID,TAB2.ID
FROM 
(
SELECT * FROM people T1
 WHERE fatherID IN ( SEL T1.ID FROM people T1 INNER JOIN  people T2 
ON(     T1.id=T2.fatherID) WHERE T1.fatherID IS NOT NULL GROUP BY 1) ) TAB1

INNER JOIN 
(
SELECT * FROM people T1
WHERE fatherID IN ( SEL T1.ID FROM people T1 INNER JOIN  people T2 
ON(   T1.id=T2.fatherID)WHERE T1.fatherID IS NOT NULL GROUP BY 1) ) TAB2

ON( TAB1.fatherID<>TAB2.fatherID)
GROUP BY 1,2
WHERE TAB1.ID <TAB2.ID;   

答案 2 :(得分:0)

SELECT T1.id , T2.id FROM 
(
    SELECT A.id,A.fid FROM family A 
    WHERE a.fid IN 
    ( 
        SELECT id FROM family
        WHERE fid IN (SELECT id FROM family WHERE fid IS NULL)
    )
)T1

JOIN
(
     SELECT A.id,A.fid FROM family A 
     WHERE a.fid IN 
     ( 
          SELECT id FROM family
          WHERE fid IN (SELECT id FROM family WHERE fid IS NULL)
     )
)T2
ON t1.fid<>t2.fid
AND t1.id<t2.id