免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 4869 | 回复: 7
打印 上一主题 下一主题

求助,如何做这样一个视图? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-06-01 09:54 |只看该作者 |倒序浏览
一个数据库有记录如:

01    aa
02    bb
03    cc
0101    abc
0102    abb
0201    bab
.......

现在想做一个视图变成

01      aa
02      bb
03      cc
0101  aa/abc
0102  aa/abb
0201  bb/bab
....

即是把父级的名字加上,不知能否实现?谢谢

论坛徽章:
0
2 [报告]
发表于 2007-06-01 10:58 |只看该作者
测试如下:
create table a(id varchar(10),name varchar(50))
go
insert a values(\'01\',\'aa\')
insert a values(\'02\',\'bb\')
insert a values(\'03\',\'cc\')
insert a values(\'0101\',\'abc\')
insert a values(\'0102\',\'abb\')
insert a values(\'0201\',\'bab\')
go
创建视图:
create view test
as
select a.id,case when len(a.id)>2 then c.name +
                                        \'/\'+a.name
                    when len(a.id)=2 then a.name end name
from a left join (
select b.id,a.name
from a inner join (select id,left(id,2) left_id
from a where len(id)>2) b on a.id=b.left_id) c on a.id=c.id
go
查询视图及其结果:
select * from test
返回:
id         name                                                                                                  
---------- -----------------------------------------------------------------------------------------------------
01         aa
02         bb
03         cc
0101       aa/abc
0102       aa/abb
0201       bb/bab

论坛徽章:
0
3 [报告]
发表于 2007-06-06 09:50 |只看该作者
多谢指教,但当超过2级就不行了.

论坛徽章:
0
4 [报告]
发表于 2007-06-06 10:36 |只看该作者
那你方便的话就把所有的数据拿出来,大家再看看

论坛徽章:
0
5 [报告]
发表于 2007-06-06 12:09 |只看该作者
create view v_a
as
select aa.id,isnull(bb.name+\'/\'+aa.name,aa.name) as name from a aa left join a bb on  aa.id like bb.id+\'_\'+\'%\'

论坛徽章:
0
6 [报告]
发表于 2008-11-07 09:45 |只看该作者

grs

李小龙是Air Jordan shoes 一个天生的巨星,nike air jordan 一个天生的巨星cheap jordan shoes 三十二岁、五部电影,air jordan shoes 李小龙的女儿李香凝澄nike jordan shoes 清对李小龙的误读

李小龙生于wholesale nike美国三藩市,他的童年和wholesale jordan shoes 少年是在香港度过的。jordan shoes wholesale 李小龙幼时身体非常瘦 wholesale air jordan 弱。他父亲为了儿子
air jordan wholesale

论坛徽章:
0
7 [报告]
发表于 2009-03-14 15:34 |只看该作者
create view v_a
as
select aa.id,isnull(bb.name+\'/\'+aa.name,aa.name) as name from a aa left join a bb on  aa.id like bb.id+\'_\'+\'%\'

本文来自: IXPUB技术社区(www.ixpub.net) 详细出处参考:http://www.ixpub.net/thread-844138-1-6.html

论坛徽章:
0
8 [报告]
发表于 2009-08-23 11:54 |只看该作者
解决方案如下:
SELECT * FROM A

id         name
---------- --------
01         aa
02         bb
03         cc
0101       abc
0102       abb
0201       bab
010102     adsa
010203     gdea
020103     jgsd
01010203   loikj

CREATE PROC PROC_A
AS
BEGIN
DECLARE @X VARCHAR(10)
SET @X = \'/\'
DECLARE @N INT    --动态的定义表名
--SET @N = 1
DECLARE @SQL NVARCHAR(1000)  --动态SQL
DECLARE @MAX_LEN INT
SET @MAX_LEN =(SELECT MAX(LEN(ID)) FROM A)
--SELECT @MAX_LEN
DECLARE @I INT
SET @I = 2
DECLARE @SQL1 NVARCHAR(1000)
DECLARE @I1 INT
SET @I1 = 1
DECLARE @M INT
SET @M = 0
DECLARE @SQL2 NVARCHAR(1000)

WHILE (@I <= @MAX_LEN)
BEGIN
SET @N = @I / 2
SET @SQL = N\'CREATE TABLE TEMP\' + CAST(@N AS NVARCHAR) + N\' (ID VARCHAR(50),[NAME] VARCHAR(50)) \' +  
           N\'INSERT INTO TEMP\' + CAST(@N AS NVARCHAR) + N\' SELECT ID,[NAME] FROM A WHERE LEN(ID) = @I \'  
EXEC SP_EXECUTESQL @SQL,N\'@I INT\',@I
SET @I = @I + 2
--SET @N = @N + 1
END
--
--DECLARE @I1 INT
--SET @I1 = 1
--DECLARE @SQL1 NVARCHAR(1000)
WHILE (@I1 <= @N - 1)
BEGIN
SET @SQL1 = N\'CREATE TABLE TEMP\' + CAST(@N+@I1 AS NVARCHAR) + N\'(ID VARCHAR(50),[NAME] VARCHAR(50)) \'+
            N\'INSERT INTO TEMP\' + CAST(@N+@I1 AS NVARCHAR) + N\' SELECT TEMP\' + CAST(@I1+1 AS NVARCHAR) + N\'.ID,\'+
            N\'TEMP\' + CAST(@I1+@M AS NVARCHAR) + N\'.[NAME]\' + \'+\' + \'@X\' + \'+\' + N\'TEMP\' + CAST(@I1+1 AS NVARCHAR) +  N\'.[NAME]\'+
            N\' FROM TEMP\' + CAST(@I1+@M AS NVARCHAR) + N\' FULL JOIN \' + N\' TEMP\' + CAST(@I1+1 AS NVARCHAR) +
            N\' ON LEFT(TEMP\' + CAST(@I1+@M AS NVARCHAR) + N\'.ID,@I1*2) = LEFT(TEMP\' + CAST(@I1+1 AS NVARCHAR) + N\'.ID,@I1*2) \'+
            N\' WHERE TEMP\' + CAST(@I1+1 AS NVARCHAR) + N\'.ID IS NOT NULL \'
EXEC SP_EXECUTESQL @SQL1,N\'@I1 INT,@X VARCHAR(10)\',@I1,@X
SET @I1 = @I1 + 1
SET @M = @N - 1
END
DECLARE @A INT
SET @A = 1
CREATE TABLE TEMP (ID VARCHAR(50),[NAME] VARCHAR(50))
INSERT INTO TEMP
SELECT * FROM TEMP1
WHILE (@A <= @I1-1)
BEGIN
SET @SQL2 = N\'INSERT INTO TEMP SELECT * FROM TEMP\' +  CAST(@N+@A AS NVARCHAR)
EXEC  (@SQL2)
SET @A = @A + 1
END
DROP TABLE TEMP1
DROP TABLE TEMP2
DROP TABLE TEMP3
DROP TABLE TEMP4
DROP TABLE TEMP5
DROP TABLE TEMP6
DROP TABLE TEMP7

SELECT * FROM TEMP
DROP TABLE  TEMP
END

EXEC PROC_A
ID                                                 NAME
-------------------------------------------------- --------------------------------------------------
01                                                 aa
02                                                 bb
03                                                 cc
0101                                               aa/abc
0102                                               aa/abb
0201                                               bb/bab
010102                                             aa/abc/adsa
010203                                             aa/abb/gdea
020103                                             bb/bab/jgsd
01010203                                           aa/abc/adsa/loikj
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP