MySQL的一张表中有父ID和子ID,

MySQL的一张表中有父ID和子ID,,第1张

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等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/10163293.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-05
下一篇 2023-05-05

发表评论

登录后才能评论

评论列表(0条)

保存