select Apid as 编号,Aname as 州,B国家,pid
from A
inner join
(select id,name as 国家,pid form A where pid ==0) B --筛选出国家的行,在连接
on Apid =Bpid
where Apid = '0'
试下这个可以吗?把A替换成表名,B不管
:号加上变量在hibernate是做为SQL语句中的参数占位符用的,比如 :name ,最后就可以用querysetParameter("name","jack");
你这SQL中加了这个@r:= ,问号前面有空格,估计这有问题。
而且就因为这个原因,觉得你这种语句在hibernate中不能顺利执行。
可以调用存储过程来执行这个查询。
下面的语句也许可以实现你的要求,但可能不是最好的办法(在 SqlServer2005中验证通过)。
CREATE TABLE [dbo][parsub](
[id] [int] NOT NULL,
[par] [nchar](10) COLLATE Chinese_PRC_CI_AS NOT NULL,
[sub] [nchar](10) COLLATE Chinese_PRC_CI_AS NOT NULL,
CONSTRAINT [PK_parsub] PRIMARY KEY CLUSTERED
(
[id] ASC
) ON [PRIMARY]
) ON [PRIMARY]
insert into parsub values(1,'A','B');
insert into parsub values(2,'B','C');
insert into parsub values(3,'C','D');
insert into parsub values(4,'D','E');
insert into parsub values(5,'U','V');
insert into parsub values(6,'V','W');
insert into parsub values(7,'W','X');
insert into parsub values(8,'AA','BB');
select from parsub
select id0=identity(int,1,1),bid,bpar,bsub into #tmp1 from parsub a right outer join parsub b on asub=bpar
where apar is null order by bid
select from #tmp1
select id0=identity(int,1,1),aid,apar,asub into #tmp2 from parsub a left outer join parsub b on asub=bpar
where bpar is null order by aid
select from #tmp2
select apar,bsub from #tmp1 a inner join #tmp2 b on aid0=bid0
drop table #tmp2
drop table #tmp1
真正使用时,可以创建一个存储过程,内容为
select id0=identity(int,1,1),bid,bpar,bsub into #tmp1 from parsub a right outer join parsub b on asub=bpar where apar is null order by bid
select id0=identity(int,1,1),aid,apar,asub into #tmp2 from parsub a left outer join parsub b on asub=bpar where bpar is null order by aid
select apar,bsub from #tmp1 a inner join #tmp2 b on aid0=bid0
drop table #tmp2
drop table #tmp1
最后一个SQL语句的结果即为:
par sub
A E
U X
AA BB
==================================================================
上面的方法只能根据最顶层节点找到末结点,不能根据中间节点找到末结点,即根据A可以找到E,但不能根据B找到E 用下面的方法可以实现任意节点的搜索:
创建一个函数:
CREATE FUNCTION [dbo][Find_Sub]
(
@par varchar(10)
)
RETURNS varchar(10)
AS
BEGIN
DECLARE @tmp_sub varchar(10)
while(1>0)
begin
if exists(select from parsub where par=@par)
begin
select @tmp_sub=sub from parsub where par=@par
return dboFind_Sub(@tmp_sub)
end
else
return @par
end
return ''
END
通过调用Find_Sub()可以找到任一个节点的末节点,如
select dboFind_Sub('A') -- return 'E'
select dboFind_Sub('B') -- return 'E'
select dboFind_Sub('E') -- return 'E'
select dboFind_Sub('AA') --return 'BB'
不足之处是每次找一个末结点都可能要执行多条Select语句。
假设这个表名为A
select from A START WITH id in
(select distinct id from A )
CONNECT BY PRIOR oid=id
oracle 10g之前执行这条语句,好像oid不能为空,你可以将id为1那条数据oid栏位设置为1或者别的,反正不要是里面有的节点的id就行了
select 再子类ID from 再子类 where 再子类文件ID in (select 子类文件ID from 子类 where 子类文件ID in(select 父类ID from 父类 where 父类文件ID=‘父类文件ID’) )
以上就是关于MySQL的一张表中有父ID和子ID,全部的内容,包括:MySQL的一张表中有父ID和子ID,、无极限分类查询,父类的id多层次查找所有的子类。直接在mysql中可以运行,但用hibernate查不能识别":="、sql查询父id下的最后一个子id等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)