今天我有一个期末考试。我高兴地批准了:但是其中一个问题真的让我大吃一惊。
我需要帮助,所以我可以安息。
问题
我们有一张桌子“人物”
(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列,一个是一个人的名字,另一个是他/她的堂兄。
直到这里很简单,对吗? 问题是我有一些限制
例如,考虑到这个例子,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
!
答案 0 :(得分:3)
您可以添加到查询WHERE p3.id < p4.id
。这样可以消除重复的结果,例如gon | maria
和maria | 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