2

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

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

问题

我们有一张“人”表

(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 | 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

4

3 回答 3

3

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

于 2013-05-22T02:34:14.473 回答
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;   
于 2015-05-11T10:47:30.853 回答
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
于 2015-05-11T10:50:48.620 回答