在一张表里,如果一个字段,有几个值,怎么办呢??

时间:2021-07-15 15:09:24
在一张表里,如果一个字段,有几个值,怎么办呢?? 
比如一张学生表
有几个字段,分别是姓名,性别,年龄,兴趣而兴趣这个字段有可能有几个值并存,
比如:
画画,写作,看书 
怎么解决啊 
 
有大侠传授我:
另建一张表,用ID关联起来,
例:
表 学生:
Id        姓名    年龄
1         A       b
2         B       c  

表 兴趣:
ID       学生Id   兴趣
1        1        d
2        1        e

但问题是:我的这个数据库中,可以多选的字段太多,有23个呢
怎么做啊?
请问是做23张子表吗?这么麻烦啊?

6 个解决方案

#1


看你數據庫設計了,第X范式的問題~~~

#2


create table student(Id int,姓名 varchar(10),年龄 varchar(10))
insert into student values(1,'A','b')
insert into student values(2,'B','c')

create table interest(ID int,学生Id int,兴趣 varchar(10))
insert into interest values(1,1,'d')
insert into interest values(2,1,'e')
go

create function f_str(@stu_id int)
returns varchar(20)
as
begin
    declare @str varchar(20)
    set @str=''
    
    select @str=@str+','+兴趣 from interest where 学生ID=@stu_id
    
    set @str=stuff(@str,1,1,'')
    
    return @str
end
go

select *,dbo.f_str(ID) as 兴趣 from student
/*
Id          姓名       年龄        兴趣                   
----------- ---------- ---------- -------------------- 
1           A          b          d,e
2           B          c          NULL
*/
go

drop function f_str
drop table student,interest
go

#3


多谢playwarcraft(时间就像乳沟,挤挤还是有的) 和libin_ftsafe(子陌红尘:当libin告别ftsafe) 两位

就是libin_ftsafe的我不大看的懂,没用过sql-server,
我现在其实是用vc和ado开发,用的是access
我只想要在用vc的时候方便一点,
请各位大侠帮我看看这个数据库的表该怎么设计?

#4


我是要做一个电梯控制器的数据库
这个电梯控制器,给了我23个属性,其中有18个是多选的
比如:
控制类型:有货梯,客梯,扶梯等种类,因为有的控制器可以控制货梯,有的控制客梯,有的客货两用。
驱动方式:交流变频,GMV,布赫泵 ……
控制方式:单梯,并联,群控……

每个控制器的这些属性都是要多选的

请各位帮忙啊,就帮我看看这个数据库怎么设计表。
因为看到这里有人气,就来了…………呵呵,用的是access,vc,ado

#5


accsee的話,可能用第2個方式比較好操作,

表 学生:
Id        姓名    年龄
1         A       b
2         B       c  

表 兴趣:
ID       学生Id   兴趣
1        1        d
2        1        e

#6


对啦,这个问题已经说得很清楚了哦,就象银行的存款一样,用户有好多个,他们每一个人的存款笔数都是无限制的,人家无限制的笔数存款都是用上面的方法处理的。
你一个兴趣怎么会存不下呢。
另外如果你的兴趣种类是固定的,也可以这样来设计,弄一个兴趣里面不可能包含的字符进行分隔各个兴趣,登录用¥¥来分隔,兴趣:吃饭¥¥穿衣¥¥睡觉¥¥走路 等,然后读出这个字段时再将得到的字符串进行分解得到兴趣系列就行了。

#1


看你數據庫設計了,第X范式的問題~~~

#2


create table student(Id int,姓名 varchar(10),年龄 varchar(10))
insert into student values(1,'A','b')
insert into student values(2,'B','c')

create table interest(ID int,学生Id int,兴趣 varchar(10))
insert into interest values(1,1,'d')
insert into interest values(2,1,'e')
go

create function f_str(@stu_id int)
returns varchar(20)
as
begin
    declare @str varchar(20)
    set @str=''
    
    select @str=@str+','+兴趣 from interest where 学生ID=@stu_id
    
    set @str=stuff(@str,1,1,'')
    
    return @str
end
go

select *,dbo.f_str(ID) as 兴趣 from student
/*
Id          姓名       年龄        兴趣                   
----------- ---------- ---------- -------------------- 
1           A          b          d,e
2           B          c          NULL
*/
go

drop function f_str
drop table student,interest
go

#3


多谢playwarcraft(时间就像乳沟,挤挤还是有的) 和libin_ftsafe(子陌红尘:当libin告别ftsafe) 两位

就是libin_ftsafe的我不大看的懂,没用过sql-server,
我现在其实是用vc和ado开发,用的是access
我只想要在用vc的时候方便一点,
请各位大侠帮我看看这个数据库的表该怎么设计?

#4


我是要做一个电梯控制器的数据库
这个电梯控制器,给了我23个属性,其中有18个是多选的
比如:
控制类型:有货梯,客梯,扶梯等种类,因为有的控制器可以控制货梯,有的控制客梯,有的客货两用。
驱动方式:交流变频,GMV,布赫泵 ……
控制方式:单梯,并联,群控……

每个控制器的这些属性都是要多选的

请各位帮忙啊,就帮我看看这个数据库怎么设计表。
因为看到这里有人气,就来了…………呵呵,用的是access,vc,ado

#5


accsee的話,可能用第2個方式比較好操作,

表 学生:
Id        姓名    年龄
1         A       b
2         B       c  

表 兴趣:
ID       学生Id   兴趣
1        1        d
2        1        e

#6


对啦,这个问题已经说得很清楚了哦,就象银行的存款一样,用户有好多个,他们每一个人的存款笔数都是无限制的,人家无限制的笔数存款都是用上面的方法处理的。
你一个兴趣怎么会存不下呢。
另外如果你的兴趣种类是固定的,也可以这样来设计,弄一个兴趣里面不可能包含的字符进行分隔各个兴趣,登录用¥¥来分隔,兴趣:吃饭¥¥穿衣¥¥睡觉¥¥走路 等,然后读出这个字段时再将得到的字符串进行分解得到兴趣系列就行了。