none
怎么表的字段的几条记录改成输入在1条记录里 RRS feed

  • 问题

  • 怎么表的字段的几条记录改成输入在1条记录里

    以下数据库结构问题我从4月1日开始想到现在还没有想到解决方法。希望有人帮帮我!非常感谢!

    如:
    字段A  字段B  值
    1       a      zhong
    1       b      zhon
    1       c      zho
    2       a      zhongg
    2       b      zhog
    3       a      zh
    3       d      zhggg

    字段A和字段B构成复合主键。

    怎么将上面这个表的字段A的几条记录改成输入在1条记录里。但不能将a、b、c 作为表的字段(因为a、b、c个数不固定,可能是a、c,或a、d、e,或c、g、k、h、l);

    如下:
    字段A  字段B  值1      值2   值3
    1       a      zhong   zhon  zho
    2       a      zhongg  zhog
    3       a      zh      zhggg

    这样改是为了节省记录条数。
    2011年4月11日 4:08

答案

  • Sorry,會錯意了

    -------------------------------------------------------------

    如果是在設計階段可以好像樓主這樣設計,實現方法可以參照以上方法

    可在表上加一個字段記錄是很幾個值


    ROY WU(吳熹)
    • 已标记为答案 cyq6 2011年4月13日 6:47
    2011年4月12日 4:10
    版主

全部回复

  • 結果應試不正確吧

    如果是行列轉換,應該不顯示字段A,或把字段A重新排序

    如:

    use Tempdb
    go
    --> -->
     
    if not object_id(N'Tempdb..#1') is null
      drop table #1
    Go
    Create table #1([字段A] int,[字段B] nvarchar(10),[值] nvarchar(50))
    Insert #1
    select 1,N'a',N'zhong' union all
    select 1,N'b',N'zhon' union all
    select 1,N'c',N'zho' union all
    select 2,N'a',N'zhongg' union all
    select 2,N'b',N'zhog' union all
    select 3,N'a',N'zh' union all
    select 3,N'd',N'zhggg'
    Go
    if not object_id(N'Tempdb..#2') is null
      drop table #2
    Select * ,ID=IDENTITY(INT,1,1) into #2 from #1
    
    DECLARE @i NVARCHAR(2),@s NVARCHAR(4000)
    SELECT TOP 1 @i=COUNT(*),@s='' FROM #2 GROUP BY [字段B] ORDER BY COUNT(*) DESC
    WHILE @i>0
      SELECT @s=N',[值'+@i+']=max(case when con='+@i+' then [值] else '''' end )'+@s,@i=@i-1
    EXEC('select [字段A]=row_number()over(order by [字段B]),[字段B]'+@s+'FROM (SELECT *,con=(SELECT COUNT(*) FROM #2 WHERE 字段B=a.字段B AND ID<=a.ID) FROM #2 AS a)t group by [字段B]')
    
    
    /*
    字段A  字段B  值1  值2  值3
    1  a  zhong  zhongg  zh
    2  b  zhon  zhog  
    3  c  zho    
    4  d  zhggg    
    */
    


    ROY WU(吳熹)
    2011年4月11日 4:28
    版主
  • 不好意思,我的结果弄错了!

    首先非常感谢对我的帮助。

    我是在设计表结构的时候想:

    如:
    字段A  字段B  值
    1       a      zhong
    1       b      zhon
    1       c      zho
    2       a      zhongg
    2       b      zhog
    3       a      zh
    3       d      zhggg

    字段A和字段B构成复合主键。

    怎么将上面这个表的字段1的几条记录改成输入在1条记录里。但不能将a、b、c 作为表的字段(因为a、b、c个数不固定,可能是a、c,或a、d、e,或c、g、k、h、l);

    将上面这个表的字段2的几条记录改成输入在1条记录里。

    将上面这个表的字段3的几条记录改成输入在1条记录里。

    如下:(这个表里也可以加别的字段,但目前我还不知道怎么设计)
    字段A    值1      值2   值3
    1            zhong    zhon  zho
    2            zhongg  zhog
    3            zh         zhggg

    以后设计好后,还要能查到1和a对应的里面的值,

    能查到1和b对应的里面的值,

    能查到1和c对应的里面的值,

    能查到2和a对应的里面的值,

    能查到2和b对应的里面的值,

    能查到3和a对应的里面的值,

    能查到3和d对应的里面的值;

     

    2011年4月11日 5:16
  • 把字段改改就行了

     

    use Tempdb
    go
    --> -->
     
    if not object_id(N'Tempdb..#1') is null
     drop table #1
    Go
    Create table #1([字段A] int,[字段B] nvarchar(10),[值] nvarchar(50))
    Insert #1
    select 1,N'a',N'zhong' union all
    select 1,N'b',N'zhon' union all
    select 1,N'c',N'zho' union all
    select 2,N'a',N'zhongg' union all
    select 2,N'b',N'zhog' union all
    select 3,N'a',N'zh' union all
    select 3,N'd',N'zhggg'
    Go
    if not object_id(N'Tempdb..#2') is null
     drop table #2
    Select * ,ID=IDENTITY(INT,1,1) into #2 from #1
    
    DECLARE @i NVARCHAR(2),@s NVARCHAR(4000)
    SELECT TOP 1 @i=COUNT(*),@s='' FROM #2 GROUP BY [字段A] ORDER BY COUNT(*) DESC
    WHILE @i>0
     SELECT @s=N',[值'+@i+']=max(case when con='+@i+' then [值] else '''' end )'+@s,@i=@i-1
    EXEC('select [字段A]'+@s+'FROM (SELECT *,con=(SELECT COUNT(*) FROM #2 WHERE [字段A]=a.[字段A] AND ID<=a.ID) FROM #2 AS a)t group by [字段A]')
    
    /*
    字段A  值1  值2  值3
    1  zhong  zhon  zho
    2  zhongg  zhog  
    3  zh  zhggg  
    */
    


    ROY WU(吳熹)
    2011年4月11日 5:50
    版主
  • 上面的语句怎么

    查到1和a对应的里面的值,

    查到1和b对应的里面的值,

    查到1和c对应的里面的值,

    查到2和a对应的里面的值,

    查到2和b对应的里面的值,

    查到3和a对应的里面的值,

    查到3和d对应的里面的值?

    谢谢!

    2011年4月11日 6:33
  • 上面的语句怎么

    查到1和a对应的里面的值,

    查到1和b对应的里面的值,

    查到1和c对应的里面的值,

    查到2和a对应的里面的值,

    查到2和b对应的里面的值,

    查到3和a对应的里面的值,

    查到3和d对应的里面的值?

    谢谢!


    可以值那里加多字段B處理,或把字段B轉為列顯示,不存在顯示為空

     

    use Tempdb
    go
    --> -->
     
    if not object_id(N'Tempdb..#1') is null
     drop table #1
    Go
    Create table #1([字段A] int,[字段B] nvarchar(10),[值] nvarchar(50))
    Insert #1
    select 1,N'a',N'zhong' union all
    select 1,N'b',N'zhon' union all
    select 1,N'c',N'zho' union all
    select 2,N'a',N'zhongg' union all
    select 2,N'b',N'zhog' union all
    select 3,N'a',N'zh' union all
    select 3,N'd',N'zhggg'
    Go
    if not object_id(N'Tempdb..#2') is null
     drop table #2
    Select * ,ID=IDENTITY(INT,1,1) into #2 from #1 ORDER BY [字段A],[字段B]
    
    DECLARE @i NVARCHAR(2),@s NVARCHAR(4000)
    SELECT TOP 1 @i=COUNT(*),@s='' FROM #2 GROUP BY [字段A] ORDER BY COUNT(*) DESC
    WHILE @i>0
     SELECT @s=N',[值'+@i+']=max(case when con='+@i+' then [字段B]+''值:''+[值] else '''' end )'+@s,@i=@i-1
    EXEC('select [字段A]'+@s+'FROM (SELECT *,con=(SELECT COUNT(*) FROM #2 WHERE [字段A]=a.[字段A] AND ID<=a.ID) FROM #2 AS a)t group by [字段A]')
    
    /*
    字段A 值1 值2 值3
    1 a值:zhong b值:zhon c值:zho
    2 a值:zhongg b值:zhog 
    3 a值:zh d值:zhggg 
    */
    GO
    
    
    

     


    ROY WU(吳熹)
    2011年4月11日 6:46
    版主
  • 按照版主的语句我测试了,设计的表格是如下的:

    字段A  字段B  值

    1 a zhong
    1 b zhon
    1 c zho
    2 a zhongg
    2 b zhog
    3 a zh
    3 d zhggg
    NULL NULL NULL

     

    我想在表输入数据值的时候,表的结构是这样的:

    如下:(这个表里也可以加别的字段,但目前我还不知道怎么设计)
    字段A    值1      值2   值3
    1            zhong    zhon  zho
    2            zhongg  zhog
    3            zh         zhggg

     

    不知道版主有理解我的用意吗?

     

    2011年4月11日 10:51
  • Sorry,會錯意了

    -------------------------------------------------------------

    如果是在設計階段可以好像樓主這樣設計,實現方法可以參照以上方法

    可在表上加一個字段記錄是很幾個值


    ROY WU(吳熹)
    • 已标记为答案 cyq6 2011年4月13日 6:47
    2011年4月12日 4:10
    版主
  • 版主好!

    版主辛苦了!

    我觉得这样设计好像可以,不知道版主根据对我的要求的理解,觉得是否可以?

    字段A           值1                 值2               值3          值4        值5       值6
    1                   a值:zhong         b值:zhon       c值:zho
    2                   a值:zhongg       b值:zhog
    3                   a值:zh              d值:zhggg


    如果这样设计,那我实际的表格可能会有100个左右的字段;

    还有单条记录中的单个字段对应的值的内容可能存几百字符;

    还有单条记录中的单个字段对应的值都要记录2个内容。(如:第一条记录"值1"字段对应记录的内容是"a值:zhong",我的第一个内容就是"a",第二个内容就是"zhong" ,"值:"相当于是分隔符,这样我以后就可以根据1查"a"对应的里面的值,得到"zhong")

    或者版主是否有更好的设计?

    非常感谢!

    2011年4月12日 5:40
  • 版主好!

    我目前的实际情况是这样的:

    我有2个数据库表:

    表1:

    字段1   字段2

    1       a      
    1       b      
    1       c      
    2       a      
    2       b      
    3       a      
    3       d      

     

    表2:

    字段1  字段2  字段3

    1       a      zhong
    1       b      zhon
    1       c      zho
    2       a      zhongg
    2       b      zhog
    3       a      zh
    3       d      zhggg

    如果有3条记录要输入,在表2里目前会生成7条记录;

     

    表1里的1可能会增加1条记录,变成:

    表1:

    字段1   字段2

    1       a      
    1       b      
    1       c      
    1       g      
    2       a      
    2       b      
    3       a     
    3       d   

     如果这样有3条记录要输入,在表2里目前会生成8条记录;

     

    表1里的3可能会增加2条记录,变成:

    表1:

    字段1   字段2

    1       a      
    1       b      
    1       c      
    1       g      
    2       a      
    2       b      
    3       a     
    3       d    
    3       h   
    3       k 

     如果这样有3条记录要输入,在表2里目前会生成10条记录;

     

    我现在觉得7条/8条/10条记录太多,影响服务器效率;

    我想如果有3条记录要输入,只在我要记录最终数据的表格,只生成3条记录; 

    表3(只有3条记录)

    字段A           字段1              字段2           字段3         

    1                   a值:zhong         b值:zhon       c值:zho
    2                   a值:zhongg       b值:zhog
    3                   a值:zh              d值:zhggg

    但还不知道怎么设计这几个表的结构?

    望版主多多帮忙! 

    2011年4月12日 9:06
  • 感谢版主对我的帮助!

     

     

    2011年4月13日 6:47

  • 但还不知道怎么设计这几个表的结构?

     

    如果設計要系統結構穩定每一個表都要有獨立的主健
    如:表1(Tab1)

    ID Col1 Col2 --ID主健,Col1和Col2建唯一約束

    表2(Tab2)

    ID Col1 OrderNr Tab1ID Value -ID主健,Col1 對應表Tab1的Col1,OrderNr記錄Co1的值順序,Tab1ID為Tab1的主健,Value為值

    這樣多一個Col1是為了提高性能

    要生成表3的結果時,可以在以上Col建上索引,在Col1和OrderNr上


     


    ROY WU(吳熹)
    2011年4月13日 10:36
    版主