SQL UNION с условиями и рекурсивным - PullRequest
0 голосов
/ 23 августа 2010

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

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

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

Обратите внимание, что Даниил упоминался Джеком

1) С идентификатором одного человека показать всех клиентских рефералов и рефералов от них до третьего эталонного уровня

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

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

Это явно не работает для AND. Тогда я попробую UNION:

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?

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

Ответы [ 3 ]

1 голос
/ 23 августа 2010

Я использую: 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, если поможет. В любом случае, я думаю, что любой код поможет мне.

Спасибо!

1 голос
/ 24 августа 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)))
0 голосов
/ 23 августа 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

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

...