一张主表存人员基本信息,一张子表存人员类别(A、B、C、D、E五类),人员类别可多选,如张三类别包括A、C、E三类,李四C、E类。现在如果要按照类别查询,如含有 C、E的人员,怎么写SQL?必须用存储过程吗?

解决方案 »

  1.   

    用mssql写的,应该差不多,楼主试一下:
    --测试数据
    if not object_id(N'Tempdb..#MainTab') is null
    drop table #MainTab
    Go
    Create table #MainTab([Id] int,[Name] nvarchar(22))
    Insert #MainTab
    select 1,N'张三' union all
    select 2,N'李四' union all
    select 3,N'王五'
    GO
    if not object_id(N'Tempdb..#DetailTab') is null
    drop table #DetailTab
    Go
    Create table #DetailTab([Id] int,[UserType] nvarchar(21))
    Insert #DetailTab
    select 1,N'A' union all
    select 1,N'C' union all
    select 1,N'E' union all
    select 2,N'C' union all
    select 2,N'E' union all
    select 3,N'A' union all
    select 3,N'B' union all
    select 3,N'C'
    Go
    --测试数据结束
    SELECT #MainTab.* FROM #MainTab JOIN (
    SELECT  Id ,
            COUNT(*) AS usercount
    FROM    #DetailTab
    WHERE   UserType IN ( 'C', 'E' )
    GROUP BY Id
    HAVING  COUNT(*) = 2) AS t
    ON t.Id = #MainTab.Id
    王五不符合条件,没有搜索出来:
      

  2.   

    先感谢楼上童鞋。除了这个类别还有其他检索条件,如根据姓氏、性别等条件,按照楼上的兄弟用join方式,那如果只根据姓氏或者性别查询(即不选择类别情况下),怎么实现?
      

  3.   

       建议你列出你的表结构,并提供测试数据以及基于这些测试数据的所对应正确结果。
       参考一下这个贴子的提问方式http://bbs.csdn.net/topics/320211382
       
       1. 你的 create table xxx .. 语句
       2. 你的 insert into xxx ... 语句
       3. 结果是什么样,(并给以简单的算法描述)
       4. 你用的数据库名称和版本(经常有人在MS SQL server版问 MySQL)
       
       这样想帮你的人可以直接搭建和你相同的环境,并在给出方案前进行测试,避免文字描述理解上的误差。
      

  4.   

    楼主看看是这个意思不,没太看明白:
    SELECT #MainTab.* FROM #MainTab JOIN (
    SELECT  Id ,
            COUNT(*) AS usercount
    FROM    #DetailTab
    WHERE   性别='男'  --就在这里加条件即可
    GROUP BY Id
    HAVING  COUNT(*) = 2) AS t
    ON t.Id = #MainTab.Id
      

  5.   

    mysql 5.6
    测试表如下:
    DROP TABLE IF EXISTS user_basic;
    CREATE TABLE user_basic (
      id INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
      user_name VARCHAR(20) DEFAULT NULL,
      user_sex VARCHAR(2) DEFAULT NULL,
      PRIMARY KEY (id)
    ) ENGINE=INNODB DEFAULT CHARSET=utf8;INSERT INTO user_basic(user_name,user_sex)
    SELECT '崔健','男' UNION ALL
    SELECT '邓超','男' UNION ALL
    SELECT '刘涛','女' UNION ALL
    SELECT '崔永元','男';DROP TABLE IF EXISTS user_category;
    CREATE TABLE user_category(  
      id INT UNSIGNED NOT NULL AUTO_INCREMENT,
      fatid INT UNSIGNED NOT NULL,
      user_category VARCHAR(10),
      PRIMARY KEY (id),
      FOREIGN KEY (fatid) REFERENCES user_basic(id)
    ) ENGINE=INNODB CHARSET=utf8 COLLATE=utf8_general_ci;INSERT INTO user_category(fatid,user_category)
    SELECT 1,'A' UNION ALL
    SELECT 1,'C' UNION ALL
    SELECT 1,'D' UNION ALL
    SELECT 2,'B' UNION ALL
    SELECT 2,'C' UNION ALL
    SELECT 3,'C' UNION ALL
    SELECT 3,'D' UNION ALL
    SELECT 3,'E' UNION ALL
    SELECT 4,'D';
    需要根据姓名、性别、子表中的类别进行检索,每个条件可以单独查询,如按性别查询;也可以组合查询,如按性别+类别查询,其中类别可以单选(如C),也可以多选(如D、C,既同时包括C、D类别的人员)
      

  6.   

    #按性别查询
    select * from user_basic where user_sex = '男'
    #按性别+类型查询
    SELECT user_basic.* FROM user_basic JOIN (
    SELECT  fatid ,
            COUNT(*) AS usercount
    FROM    user_category
    WHERE   user_category IN ( 'C', 'D' )
    GROUP BY fatid
    HAVING  COUNT(*) = 2) AS t
    ON t.fatid = user_basic.Id
    where user_sex = '男' 
      

  7.   

    楼上,你的这两个是分两条SQL语句实现,我想检索条件单独和组合是用一条语句实现,既一条SQL 就可以同时实现单个条件查询和多个条件组合查询(根据检索条件自动匹配)
      

  8.   

    这个一般是在程序中实现,通过对用户输入的条件进行判断生成不同的SQL语句的WHERE部分,