SQL UNION с условиями и рекурсивным

у меня проблемы с 2 запросами для моего класса БД.

У меня есть одна таблица «клиенты» с этими столбцами:

name   | id     | date     | points | REFERRAL
---------------------------------------------
daniel | 123456 | 01-01-01 | 50     | 321321
jack   | 321321 | 01-01-01 | 30     | 555555

Обратите внимание, что daniel был рекомендован jack

1) С ID одного человека показать все рефералы клиентов и рефералы от них на третий реферальный уровень

Сначала я думаю о чем-то подобном, только для эталонного уровня 2:

SELECT C1.name
FROM Clients C1, Clients C2
WHERE C1.REFERRAL= 21000301
      AND C1.id= C2.REFERRAL

Это явно не работает для AND. Затем я пробую СОЮЗ:

SELECT C1.id, C1.REFERRAL
FROM Clients C1
WHERE C1.REFERRAL= 21000301

UNION

SELECT C2.id, C2.REFERRAL
FROM Clients C2
WHERE C2.REFERRAL= C1.ID

Но не могу получить доступ к C1 на втором SELECT

Итак, мой вопрос в том, что есть способ договориться с СОЮЗОМ. Если нет, то как я могу это решить?

2) Показать имя и общее количество рефералов клиенту с большим количеством прямых и косвенных рефералов.

На этом я полностью потерян: D, Может быть, это рекурсивно? Есть ли что-то подобное в SQL?

Заранее спасибо и извините за мой плохой английский.


person danielfrg    schedule 23.08.2010    source источник


Ответы (3)


Я использую: c1.referral = 21000301, потому что мне нужны рефералы одного человека с данным идентификатором, и этот идентификатор находится на столе, просто для тестирования.

Я пробую это:

SELECT  C1.name
FROM    Clients C1
JOIN    Clients C2
ON      C1.id = C2.REFERRAL
JOIN    Clients C3
ON      C2.id = C3.REFERRAL
WHERE   c1.referral = 21000301

Но он показывает только одно имя 8 раз.

А насчет базы данных я действительно не знаю, мой колледж занимается хостингом, я использую Oracle SQL Developer, если это поможет. В любом случае, я думаю, любой код мне поможет.

Спасибо!

person danielfrg    schedule 23.08.2010
comment
Попробуйте также выбрать c2.name и c3.name. PS вместо того, чтобы добавлять ответ на свой вопрос, рассмотрите возможность редактирования самого вопроса. - person Andomar; 23.08.2010
comment
Спасибо, насчет БД, которую мы используем, oracle 10g, надеюсь, вы поможете мне со вторым вопросом. - person danielfrg; 23.08.2010
comment
лучше спросите об этом в новом вопросе с тегом Oracle. Я предполагаю, что это связано с подключением, но эксперты могут рассказать вам больше :) - person Andomar; 23.08.2010

Я разобрался :D

select c.name
from CLIENTS C
where c.REFERRAL=21000301 OR c.REFERRAL
   IN(SELECT c.id FROM CLIENTS C WHERE c.REFERRAL=21000301 OR c.REFERRAL
   IN(SELECT c.id FROM CLIENTS C WHERE c.REFERRAL=21000301 OR c.REFERRAL
   IN(SELECT c.id FROM CLIENTS C WHERE c.REFERRAL=21000301)))
person danielfrg    schedule 24.08.2010

Причина, по которой ваш первый пример не работает, заключается в том, что c1.referral = 21000301: такой строки нет. Если вы опустите это, запрос будет работать:

SELECT  C1.name
FROM    Clients C1, Clients C2
WHERE   C1.id = C2.REFERRAL

Или переписать более понятно как соединение для двух уровней:

SELECT  C1.name
FROM    Clients C1
JOIN    Clients C2
ON      C1.id = C2.REFERRAL
JOIN    Clients C3
ON      C2.id = C3.REFERRAL

Вам понадобится только рекурсивный запрос для произвольного уровня рефералов. Синтаксис рекурсивного запроса различается в зависимости от базы данных, поэтому вам придется сообщить нам, какую базу данных вы используете.

person Andomar    schedule 23.08.2010
comment
Пожалуйста, смотрите следующий ответ (здесь код выглядит ужасно), надеюсь, вы сможете мне помочь. - person danielfrg; 23.08.2010