2010-08-23 70 views
0

我遇到了2个用于查询我的数据库类的问题。具有条件和递归的SQL UNION

我有一个表的“客户”与此列:

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选择

所以,我的问题是,有一种方法,使与UNION条件。 如果不是,我该如何解决这个问题?

2)以更直接和间接的引荐方式向客户展示引荐的名称和总数。

在这一个我完全失去了:D,可能是递归?在SQL中是否有类似的东西?

在此先感谢,并对不起我的英文不好。

回答

1

我弄明白: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

你的第一个例子doens't工作的原因是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 

你只需要转诊的任意水平的递归查询。递归查询语法因数据库而异,因此您必须告诉我们您正在使用哪个数据库。

+0

请参阅下一个答案(代码看起来可怕在这里),我希望你能帮助我。 – danielfrg 2010-08-23 03:58:49

1

即时消息使用:c1.referral = 21000301因为我需要一个人给予该ID的引荐,并且该ID在桌面上,仅用于测试。

我试试这个:

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。无论如何,我猜想任何代码都会帮助我。

谢谢!

+0

尝试选择c2.name和c3.name。 PS而不是为自己的问题添加答案,请考虑编辑问题本身。 – Andomar 2010-08-23 04:55:44

+0

谢谢,关于我们使用oracle 10g的数据库,希望你能帮我解决第二个问题。 – danielfrg 2010-08-23 14:03:28

+0

更好的问一个标签为Oracle的新问题。我猜它涉及连接,但专家可以告诉你更多:) – Andomar 2010-08-23 16:27:32