列和行的相匹配a表
主键   姓名  班级 年龄
1     aa    03    18b表
主键   名称   启用
1      姓名   true
2      班级   true
3      年龄   false这是两张表,我需查询a表的列的数据,条件是在b表中对应的为true的谢谢大家,帮个忙

解决方案 »

  1.   

    --> 测试数据:a表
    if object_id('a表') is not null drop table a表---->建表
    create table a表([主键] int,[姓名] varchar(2),[班级] varchar(2),[年龄] int)
    insert a表
    select 1,'aa','03',18
    GO
    --> 测试数据:b表
    if object_id('b表') is not null drop table b表---->建表
    create table b表([主键] int,[名称] varchar(4),[启用] varchar(5))
    insert b表
    select 1,'姓名','true' union all
    select 2,'班级','true' union all
    select 3,'年龄','false'
    GO--> 查询结果
    SELECT * FROM a表
    --> 删除表格
    --DROP TABLE a表
    --> 查询结果
    SELECT * FROM b表
    --> 删除表格
    --DROP TABLE b表
    declare @sql varchar(200)
    set @sql='select '+stuff((select ','+b表.名称 from b表 where 启用 ='true' for xml path('')),1,1,'')+' from a表'
    exec (@sql)-----------------
    姓名 班级
    aa 03
      

  2.   

    declare @col varchar(1000)
    select @col=isnull(@col+',','')+名称 from b where 启用='true'exec ('select '+@col+' from a')
      

  3.   

    declare @sql varchar(200)
    set @sql='select '+
    stuff(REPLACE(REPLACE((select  b表.名称 from b表 where 启用 ='true' FOR XML AUTO),'<b表 名称="', ','), '"/>', ''), 1, 1, '')
    +' from a表'
    exec (@sql)这样也可以
      

  4.   


    if object_id('b')>0
    drop table b
    create table b
    (
    主键 int,
    名称 varchar(20),
    启用 varchar(5)
    )
    if object_id('a')>0
    drop table a
    create table a
    (
    主键 int ,
    姓名 varchar(20),
    班级 varchar(4),
    年龄 int
    )insert into a 
    select 1 ,'aa', '03', 18insert into b
    select 1 ,'姓名', 'true'
    union all
    select 2, '班级', 'true'
    union all
    select 3, '年龄', 'false'select * from a
    select * from bdeclare @s varchar(100)
    set @s = ''
    select @s = @s+ 名称 +',' from b where 启用 = 'true'
    --print left(@s,len(@s)-1)
    declare @s1 varchar(100)
    set @s1=left(@s,len(@s)-1)declare @sql varchar(max)
    set @sql ='select '+@s1+' from a'
    --print @sqlexec(@sql)结果
    姓名     班级
    aa 03
      

  5.   

    CREATE TABLE a(主键 INT,姓名 VARCHAR(20),班级 VARCHAR(20),年龄 INT)
    CREATE TABLE b(主键 INT,名称 VARCHAR(20),启用 BIT)INSERT INTO a(主键,姓名,班级,年龄)
    SELECT 1,'aa','03',18INSERT INTO b(主键, 名称,启用)
    SELECT 1,'姓名',1 UNION ALL
    SELECT 2,'班级',1 UNION ALL
    SELECT 3,'年龄',0
    DECLARE @sqlstr VARCHAR(200)SET @sqlstr = ''SELECT @sqlstr = @sqlstr + b.名称 + ',' FROM b WHERE b.启用 = 1IF (LEN(@sqlstr) > 0) 
    BEGIN
        SELECT @sqlstr = SUBSTRING(@sqlstr,1,LEN(@sqlstr)-1)
        SELECT @sqlstr = 'select a.主键,' + @sqlstr + ' from a'
    END
    ELSE SELECT @sqlstr = 'select a.主键 from a'EXEC sp_sqlexec @sqlstr
      

  6.   

    那如果说我还要跟外键关联呢?比如说那个a表班级为1 另外还有一个C表
    主键    班级ID 班级名称
    1        1      03
    这个应该怎么做呢?
    还有如果A表上面的列是英文,我想取个别名,改成中文应该怎么写。比如班级列名为class我想显示的时候列名为班级
      

  7.   


    create table tbl_a(id int,aName varchar(20),aClass varchar(20),aAge int)insert into tbl_a
    select 1,'name1','class1',21 union all
    select 2,'name2','class2',22 select * from tbl_acreate table tbl_b(id int,bName varchar(20),bBool varchar(20))insert into tbl_b
    select 1,'姓名','true' union all
    select 2,'班级','true' union all
    select 3,'年龄','false'
    create table tbl_ab(id int,name_En varchar(20),name_Cn varchar(20))
    insert into tbl_ab
    select 1,'aName','姓名' union all
    select 2,'aClass','班级' union all
    select 3,'aAge','年龄'
    declare @s varchar(100)
    set @s = ''
    select @s = @s+ ab.name_En +',' from tbl_b b,tbl_ab ab where bBool = 'true' and ab.name_Cn = b.bNamedeclare @ss varchar(100)
    set @ss = left(@s,len(@s)-1)declare @strSQL varchar(500)
    set @strSQL = 'select ' + @ss+ ' from tbl_a'exec(@strSQL)