求实现以下结果的sql

lxw2100 2010-06-02 08:05:02
nodeid
00026
0002600150
000260015000001
000260015000002
000260015000003
00027


nodeid haschild
00026 1
0002600150 1
000260015000001 0
000260015000002 0
000260015000003 0
00027 0

有上面表的数据查询得到下面的结果:该数据有下层数据时haschild为1,否则为0;总共有三层!
请教该sql如何实现?
...全文
92 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
lxw2100 2010-09-06
  • 打赏
  • 举报
回复
次问题已解决!谢谢以上诸位关注!
ShenLiang2025 2010-06-07
  • 打赏
  • 举报
回复



--1)表和结构

IF OBJECT_ID('[tb]') IS NOT NULL
DROP TABLE [tb]
GO
CREATE TABLE [tb] ([nodeid] [nvarchar](20))
INSERT INTO [tb]
SELECT '00026' UNION ALL
SELECT '0002600150' UNION ALL
SELECT '000260015000001' UNION ALL
SELECT '000260015000002' UNION ALL
SELECT '000260015000003' UNION ALL
SELECT '00027'

--SELECT * FROM tb

--2)In的写法

SELECT nodeid,haschild = CASE WHEN nodeid IN
(SELECT nodeid
FROM tb a
WHERE EXISTS
(SELECT nodeid FROM tb b
WHERE CHARINDEX(a.nodeid,b.nodeid) > 0 AND a.nodeid <> b.nodeid
) )THEN 1 ELSE 0 END
FROM tb

--3)结果
nodeid haschild
-------------------- -----------
00026 1
0002600150 1
000260015000001 0
000260015000002 0
000260015000003 0
00027 0

(6 row(s) affected)



htl258_Tony 2010-06-02
  • 打赏
  • 举报
回复
--> 生成测试数据表: [tb]
IF OBJECT_ID('[tb]') IS NOT NULL
DROP TABLE [tb]
GO
CREATE TABLE [tb] ([nodeid] [nvarchar](20))
INSERT INTO [tb]
SELECT '00026' UNION ALL
SELECT '0002600150' UNION ALL
SELECT '000260015000001' UNION ALL
SELECT '000260015000002' UNION ALL
SELECT '000260015000003' UNION ALL
SELECT '00027'


-->SQL查询如下:
SELECT *, haschild = CASE
WHEN EXISTS(
SELECT 1
FROM tb
WHERE nodeid LIKE t.nodeid+'%'
AND LEN(nodeid)>LEN(t.nodeid)
) THEN 1
ELSE 0
END
FROM [tb] t
/*
nodeid haschild
-------------------- -----------
00026 1
0002600150 1
000260015000001 0
000260015000002 0
000260015000003 0
00027 0

(6 行受影响)
*/

27,580

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 应用实例
社区管理员
  • 应用实例社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧