2013-05-22 2 views
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) с идентификатором таблицы (PK) Мне нужно сделать запрос, который показывает мне 2 столбца, в одном имени человека, а в другом - его/ее кузен.

Довольно простой, пока здесь, не так ли? Проблема в том, что у меня есть некоторые ограничения

  • ТОЛЬКО ANSI разрешено. NO T-sql или другой. Кроме того, ANSI 99 стандарт, а не 2003 или выше
  • подзапросы не допускаются. И самое плохое:
  • NO отношения повторяются.

Например, учитывая в этом примере, 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 

конечно, это не решает последнюю requeriment, и у меня есть 4 в тесте (мы проходим с 4), но в любом случае , голова горит. Пожалуйста, помогите мне!

Еще варианты изучены

один из моих друзей, которые также имели один и тот же экзамен, сказал мне

«Ну, учитывая каждое отношение дублируется, я могу использовать верхнюю COUNT (*) и порядок и получить половину верных "

но .. Top не ANSI!

ответ

3

Вы можете добавить свой запрос WHERE p3.id < p4.id. Это устранит дублирующие результаты, такие как gon | maria и maria | gon.

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