现在有这样的表t1
表结构是这样的:
id     a1     a2       a3     a4  ....
1      A      B        C      D
2      B      C        D      E
3      C      A        G      CD
4      A      B        S      AB
5      C      D        E      C
6      B      A        F      C
7      G      B        A      C
...
其中表的T1是动态创建的,字段数量是未知的,意思就是T1表字段可能到A4,下一次T1表的字段可能就到A20了现在想从这个表中查出最大字母来怎么做。比如上表的最大的字母是“S”。
这个SQL如何写啊。

解决方案 »

  1.   

    如果只是这个表和查询字母S的话
    select * from t1 where "s" in(A1,A2,A3,A4)
      

  2.   

    --假设你的每个字段,其字母是从A到Z排列,使用系统表和动态sql完成.
    create table tb(id int,a1 varchar(10),a2 varchar(10),a3 varchar(10),a4 varchar(10)) 
    insert into tb values(1 ,'A', 'B', 'C', 'D')
    insert into tb values(2 ,'B', 'C', 'D', 'E')
    insert into tb values(3 ,'C', 'A', 'G', 'CD')
    insert into tb values(4 ,'A', 'B', 'S', 'AB')
    insert into tb values(5 ,'C', 'D', 'E', 'C')
    insert into tb values(6 ,'B', 'A', 'F', 'C')
    insert into tb values(7 ,'G', 'B', 'A', 'C')
    godeclare @sql varchar(8000)
    select @sql=isnull(@sql + 'select left(reverse(','') + name + '),1) a from tb union '
    from syscolumns where id=object_id('tb') and name != 'ID'
    select @sql='select max(a) 最大值 from (select left(reverse(' + left(@sql,len(@sql) - 5) + ') t'
    --print @sql
    exec(@sql)drop table tb/*
    最大值  
    ---- 
    S*/
      

  3.   

    恐怕8000字符不够用,遇到CD AB这样的多个选项的时候用select max('CD')也不行吧
      

  4.   

    字段名是A1,A2,A3,A4...A100...A1024
    这样的,不是从A。。Z排列的
      

  5.   

    用游标吧,这是最笨的方法了
    declare @Value varchar(10)
    declare @Sql varchar(100)
    declare @Max varchar(10)create table #tmp1(maxvalue varchar(10) null)declare cr_t1 cursor for
    select name from syscolumns 
    where id=object_id('t1') and name <> 'ID' --从系统表中找到有多少个字段要计算open cr_t1FETCH NEXT FROM cr_t1
    into @ValueWHILE @@FETCH_STATUS = 0
    BEGIN  exec ('insert into #tmp1 select Max = max('+ @Value +') from tbdde1')  FETCH NEXT FROM cr_t1 INTO @Value
    END
    CLOSE cr_t1
    DEALLOCATE cr_t1select max(maxvalue) from #tmp1
      

  6.   

    遇到CD AB这样的多个选项的时候用select max('CD')也不行吧