一直没有解决一个SQL语句的问题,在线等,急啊

sunzhong2003 2007-05-25 02:30:49
SQLSERVER数据库表2个
表1
Id | 会员编号
1 | 2,32
2 | 4,3
表2
会员编号 | 姓名
2 | 小李
3 | 小周
4 | 小吴
32 | 小王

请问如何用SQL语句取出如下格式的
Id | 姓名
1 |小李,小王
2 |小吴,小周
...全文
414 35 打赏 收藏 转发到动态 举报
写回复
用AI写文章
35 条回复
切换为时间正序
请发表友善的回复…
发表回复
szh3210 2007-05-26
  • 打赏
  • 举报
回复
这种关系还是比较麻烦.想到的只有两个办法
要么分割 表1的 会员编号.
要么把表1分拆成主从关系,建多一个明细表
sunzhong2003 2007-05-26
  • 打赏
  • 举报
回复
每种设计必有原因,合理取舍是我们的本职工作.
如果是初学,那是经验问题
如果不是,那就是业务要求,没办法
wzytiger 2007-05-25
  • 打赏
  • 举报
回复
我不明白你这样设计数据库什么目的?
但还是楼上说的对,用函数分一下,比如split()函数,但是那样的话就没必要把数据库设计成这样了,没能力解决,关注中.............................
sunzhong2003 2007-05-25
  • 打赏
  • 举报
回复
感谢大家热心参与,下周一结贴,分不多请大家原谅,下次补上
sbqcel 2007-05-25
  • 打赏
  • 举报
回复
CREATE TABLE TABLE1
(
ID1 INT,
NUM1 VARCHAR(20)
)


CREATE TABLE TABLE2
(
NUM2 VARCHAR(20),
NAME2 VARCHAR(20)
)

INSERT INTO TABLE1(ID1,NUM1) VALUES(1,'2,32')
INSERT INTO TABLE1(ID1,NUM1) VALUES(2,'4,3')


INSERT INTO TABLE2(NUM2,NAME2) VALUES(2,'小李')
INSERT INTO TABLE2(NUM2,NAME2) VALUES(3,'小周')
INSERT INTO TABLE2(NUM2,NAME2) VALUES(4,'小吴')
INSERT INTO TABLE2(NUM2,NAME2) VALUES(32,'小王')

CREATE FUNCTION RETURN_NAME(@NUM1 VARCHAR(20))
RETURNS VARCHAR(20)
AS
BEGIN
DECLARE @RTVALUE VARCHAR(20)
SET @RTVALUE = ''
DECLARE @TEMP VARCHAR(20)
WHILE(LEN(@NUM1)>0)
BEGIN
IF(CHARINDEX(',',LTRIM(@NUM1))=0)
BEGIN
SELECT @TEMP = NAME2 FROM TABLE2 WHERE NUM2 = @NUM1
SET @NUM1 = ''
END
ELSE
BEGIN
SELECT @TEMP = NAME2 FROM TABLE2 WHERE NUM2 = SUBSTRING(@NUM1,1,CHARINDEX(',',@NUM1)-1)
END
SET @RTVALUE = @RTVALUE + @TEMP + ','
SET @NUM1 = SUBSTRING(@NUM1,CHARINDEX(',',@NUM1)+1,LEN(@NUM1)-CHARINDEX(',',@NUM1))
END
RETURN SUBSTRING(@RTVALUE,1,LEN(@RTVALUE)-1)
END

SELECT ID1,dbo.RETURN_NAME(NUM1) FROM TABLE1

写的比较槽
sunzhong2003 2007-05-25
  • 打赏
  • 举报
回复
关于设计,你可以跟我探讨,如果你很牛的话。我的MSN:sunzhong2003@hotmail.com
对于范式问题,有些时候并不是你照书上怎么写,你就应该怎么做的。有写时候,宁愿是第一范式,以为太多的主外键连接势必会影响性能。
我这个设计是我做一个系统,由于一个人做,工作量大,所以有些就偷懒写了。
匿名用户12345 2007-05-25
  • 打赏
  • 举报
回复
答案楼上都有了


我这里就说一句,楼主别不爱听,数据库设计的第一范式就是单条记录不可拆分啊

你这样设计是严重有问题的
guojh021 2007-05-25
  • 打赏
  • 举报
回复
我写思路:

写个函数,传入参数,会员编号('4,3'),返回('小吴,小周')

把会员编号以","分隔,查询表2,拼接字符串,反回值。
PCI_E 2007-05-25
  • 打赏
  • 举报
回复
用临时表一条一条加进去,然后在查询临时表
x1234521 2007-05-25
  • 打赏
  • 举报
回复
这样一句就搞定,速度还算不错

select id,dbo.returnname(uno) as 姓名 from a

这样应该是最好的方法了
x1234521 2007-05-25
  • 打赏
  • 举报
回复
加个函数吧
CREATE FUNCTION dbo.returnname (@a varchar(1000))
RETURNS varchar(1000)
AS
BEGIN
DECLARE @splitlen int
declare @split char
set @split = ','
declare @re table(col varchar(50))
SET @splitlen=LEN(@split+'a')-2
WHILE CHARINDEX(@split,@a)>0
BEGIN
INSERT @re VALUES(LEFT(@a,CHARINDEX(@split,@a)-1))
SET @a=STUFF(@a,1,CHARINDEX(@split,@a)+@splitlen,'')
END
INSERT @re VALUES(@a)
set @a = ''
select @a = @a + b.uname + ',' from @re,b where col = b.uno
if @a <> ''
set @a = left(@a,len(@a) - 1)
RETURN @a
END

=================
执行
--======================测试数据
create table a (id int,uno varchar(50))
insert into a select '1','2,32'
union all select '2','4,3'

create table b (uno int,uname varchar(50))

insert into b select '2','小李'
union all select '3','小周'
union all select '4','小吴'
union all select '32','小王'
--==============================




select id,dbo.returnname(uno) as 姓名 from a

drop table a
drop table b
silent_x 2007-05-25
  • 打赏
  • 举报
回复
用函数吧

函数里先分解编号

然后逐一查询出名字

拼接在返回的字符串里
setcs_lina 2007-05-25
  • 打赏
  • 举报
回复
不过你说的一句话实现我就不会了,,
使用了游标,,效率不太好。
setcs_lina 2007-05-25
  • 打赏
  • 举报
回复
这样子写:
先写个分隔的函数:
CREATE function fun_SplitString
(
@Str VARCHAR(8000),
@Chr varchar(10)
)
Returns @TempTable TABLE(String VARCHAR(20))
--实现split功能的函数
--说明:@aString,字符串,如“27,28,29”;@pattern,分隔标志,如“ ,”
as

begin
declare @i int
set @Str=rtrim(ltrim(@Str))
set @i=charindex(@Chr,@Str)
while @i>=1
begin
insert @TempTable values(left(@Str,@i-1))
set @Str=substring(@Str,@i+1,len(@Str)-@i)
set @i=charindex(@Chr,@Str)
end
if @Str<>''
insert @TempTable values(@Str)
return
end
---------------
再写个合并函数:
CREATE FUNCTION [dbo].[fun_UniteName]
(
-- Add the parameters for the function here
@id int
)
RETURNS nvarchar(255)
AS
BEGIN
-- Declare the return variable here
Declare @strchars nvarchar(255)
set @strchars=''
SET @strchars = (Select Name from 表 where ID=@id)

DECLARE @message nvarchar(255)
SET @message =''
if(rtrim(@strchars) !='')
begin
DECLARE @place nvarchar(50)
DECLARE place_cursor CURSOR FOR
Select String from dbo.fun_SplitString(@strchars,',')
open place_cursor
FETCH NEXT FROM place_cursor INTO @place
WHILE @@FETCH_STATUS = 0
BEGIN
select @message = @message+ ' ' + (select name from 表2 where id=@place )
FETCH NEXT FROM place_cursor INTO @place
END
CLOSE place_cursor
DEALLOCATE place_cursor
end
-- Return the result of the function
return @message

END




x1234521 2007-05-25
  • 打赏
  • 举报
回复
一条语句应该写不出来。
sunzhong2003 2007-05-25
  • 打赏
  • 举报
回复
看来最简单,在程序里取好了,不过太占资源
sunzhong2003 2007-05-25
  • 打赏
  • 举报
回复
这里要注意,会员编号相是不定的
beyongpaul 2007-05-25
  • 打赏
  • 举报
回复
等待高手
怎么取两个表的 不同字段````
sunzhong2003 2007-05-25
  • 打赏
  • 举报
回复
感谢大家热心参与,本人专搞以下系统
一、企业信息化:如:报价系统、OA系统、客户关系管理系统等。
二、GIS系统(MAPINFO、ARCINFO)。
三、电子商务(大中型B2C、B2B、C2C系统)。
四、电子政务(政府办公软件)。
希望以后多多交流
xingyjj 2007-05-25
  • 打赏
  • 举报
回复
一个SQL语句肯定是不可以的
要用镶套循环语句就可以实现
因为你 会员编号 2,32是一个字符串
要现提取出来处理后,分成2和32后
在用2去检索表2对应的人名,玩了用32在检索
最后把结果合并就可以了啊
哈哈

加载更多回复(15)
1. 思考一下   学习Java之前,先别,静下心来好好想想:   1)你对学习Java是否有兴趣?   2)你是否能静下心来坚持不懈地学习?   嗯,这是个容易但又绝对不应该忽略的问题,你确信自己对Java感兴趣、而且又有吃苦的准备,那你才可能学好Java!如果具备这两点条件,就请继续往下看……   2. 准备一下   请不要把你的学习Java之路和其它计算机技术分开看待,技术的联系往往是千丝万缕的,你应该掌握一些学习Java所涉及的基础知识,对于“CLASSPATH要怎么设置啊”、“跪求JDK下载地址”等等问题,你不该问,因为Internet上太多答案了,甚至换个角度说,你是不是还不适合直接学习编程?   1)买本Java学习用书。   JDK 6正式版刚刚推出,市面上你暂时买不到JDK6的书籍,但我仍推荐你买一本适合入门的、较新JDK版本的Java书籍,那么,你现在选择一本讲述JDK5的入门书籍还是有条件的。我可以推荐一些入门书,但是我不打算这么做,因为合我口味的,不一定适合你。但无论如何,《Thinking In Java》绝对不应该作为你入门Java的第一本书籍!   记住,网络上学习Java的资源很多,但基本不够系统,拥有一本Java入门书籍,是你系统学习Java的基础。   2)准备Java学习环境。   准备你的学习环境,很简单,安装JDK6,然后用类似UltraEdit、EditPlus的文本编辑器配置你的学习环境,Internet上有很多关于如何配置的文章。初学Java,不建议用IDE工具,通过一行行的敲代码,你会碰到很多问题,只有这样,你才能学会怎样解决问题,并加深自己对Java的理解。   准备好后,开始进入激动人心的Java学习里程吧!   3. Java基础学习之路   学习Java的过程虽然辛苦些,但又是处处有精彩!学习过程中的心态一定要保持专一,网上关于语言间的“PK”到处都是,别被浮躁影响!认准了Java,你就坚持!克服心魔,恒心最终会给你回报的。   Java的体系分为Java SE、Java EE和Java ME(JDK 5.0以前分别叫J2SE、J2EE和J2ME),Java的敲门砖就是Java SE了,也就是你要入门学习的内容,不论你日后是选择哪个体系领域作为发展方向,你都得从Java SE起步。   学习Java SE,打好Java基础;如果想学Java EE(对不起,我不了解JavaME,所以我无法涉及JavaME的相关内容),对于AWT、Swing是否要学习呢,我个人是觉得还是要知道其所以然的,特别是其事件处理模式,我强烈建议初学者一定要弄清楚,其他具体的开发就不一定要全面掌握了,毕竟AWT、Swing方面的内容足够用几本大部头的书才能描述详尽;当然,如果你的工作就是做AWT、Swing开发,那就另当别论了。   I/O、Thread都是基础之一。   4. Java EE学习之路   学习了Java SE,还只是完成“万里长征”的第一步。   接下来选择学习Java EE或是Java ME(或者你还想不断深入学习JavaSE,只要你喜欢,你可以一直深入下去,就像前面所说的,我不会讲到Java ME的学习);估计选择Java EE方面的学习者会多一些,JavaEE所涉及技术非常多,考虑到初学者的接受程度,我会尽量从最常用的角度来介绍。   学习Java EE,在开发环境上不建议再用文本编辑器,我感觉NetBeans 5.5(目前最高正式版本)很适合初学者,我个人也很喜欢NetBeans,如果你喜欢用别的IDE如Eclipse,都没问题,看自己喜欢吧。   4.1 学习JSP/Servlet   Java EE最高版本目前是5.0版本。   在JavaEE中,首先要学习JSP/Servlet(结合Tomcat、MySQL)技术,建议JSP1.2/2.X的知识都要掌握,毕竟现在很多的在用系统都还是基于JSP1.2,学习JSP,还必须掌握一些外延技术,如:你还得掌握HTML基础知识,最好再掌握些JavaScript(目前正火的AJAX技术之一)、CSS的技术,而了解XML是必不可少的(至少描述性配置信息是通过XML来描述的)。在学习JSP/Servlet过程中,应该结合学习JDBC、数据库开发技术,毕竟绝大多数Java Web项目都是和数据库紧密结合的。   4.2 学习数据库开发技术   这里我想重点说一下数据库开发技术,数据库技术是做业务系统必备技能,JavaWeb开发人员最低程度都应该掌握SQL语句的使用!数据库技术大体可分为DBA技术和数据库开发技术,对于开发而言,应侧重数据库开发技术,而数据库基本操作,也是要掌握的。常用数据库有DB2、Oracle、SQLServer、My

62,067

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

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