求教一个SQL语句

表结构如下:
id name parentid
1001 仓库一 0
1002 仓库二 0
1003 柜台一 1001
1004 柜台二 1002
1005 第三排 1003
输入 id=1005 我想要的查询结果:
仓库一#柜台一 #第三排
使用sql语句应该怎么写
[b]问题补充:[/b]
不能限定几层,比如说:sun201200204的答案他就是限定为三层了,改问题的层数是不知道的

这是个常见问题啊,

一般来说不能用一条sql解决,改表后可用一条sql解决

解决办法视情况而定,假如你知道最多父节点只有4、5级,也就是级别不多的情况下,那么用程序语言如PHP,java递归(这种情况还要细分,如果表记录不多的话,可以一次读入整张表,否则多次读,读一次查一次)

假如级别很多,比如有十多级,则你应该给表加冗余字段来解决,可以做到用一条sql来解决,缺点是删除记录时要小心,增加记录也要小心。
加冗余字段又有几种方法,有一种是加左右节点的,请查看数据结构的资料,
还有一种容易理解,加2个字段,分别是级别和位置字段。

表结构如下:
id name parentid level location(字符串类型)
1001 仓库一 0 1 1001
1002 仓库二 0 1 1002
1003 柜台一 1001 2 10011003
1004 柜台二 1002 2 10021004
1005 第三排 1003 3 100110031005
是不是很简单,实际上parentid就是多余字段了,可以不要了。
当然查名字还要查一下,总之不递归了。查两次。

如果分三条语句的话很简单,一句的话不大可能吧。。。

xieye解答很好,学习了.

如果是oracle是可以的,
select * from table(表) start with id=1005 connect by prior parentid=id;

我不知道你最多有几层关联,如果关联太多的话,用程序搞好点。
少的话,可以写一个sql。比如最多有3层:

[code="sql"]
select t1.id,decode(t1.id,'',
decod(t2.id,'',t3.name,t2.name||'#'||t3.name),
t1.name||'#'||t2.name||'#'||t3.name)
from test t1,test t2,test t3
where t3.id='1' and t3.p_id=t2.id(+) and t2.p_id=t1.id(+);
[/code]

sbzk说中了

方法一:
[code="Sql"]
select max(sys_connect_by_path(name,'#')) rm
from (select t.*,rownum rn from test)
start with rn=1
connect by rn-1=prior rn;
[/code]

方法二:

[code="Sql"]
create or replace function ff (P_CO VARCHAR2)
return varchar2 is
v_co varchar2(400);
begin
for c1 in (select co from A WHERE CO=P_CO ) LOOP
v_co:=v_co||','||C1.CO;
END LOOP;
RETURN V_CO;
END ;
select MAX(FF(CO) FROM A;