客户经常改动表的字段,因此表的字段可以拓展,所以采用下面的设计:
一般我们把一个人员的信息(各个字段),横着记录。现在的设计是竖着放置,也就是每个字段的值
对于一条记录。t_constraction 机构表,定义不同人员的不同字段,如下:
-------------------------------------------------
| PersonType |fieldId | fieldName | … |
--------------------------------------------------
|  开发人员    | 1 | name |
-------------------------------------------------
|  开发人员    | 2 | age  |
-------------------------------------------------
|  开发人员    | 3 | emial |
-------------------------------------------------
|  销售人员    | 1 | name |
-------------------------------------------------
|  销售人员    | 2 | level |
-------------------------------------------------t_content 内容表,存放人员的记录,如下:
-------------------------------------------------
| PersonId | fieldId | fieldValue | … |
--------------------------------------------------
| 22       | 1       | 张三       | 
--------------------------------------------------
| 22       | 2       | 20          |
--------------------------------------------------
| 22       | 3       | [email protected]
--------------------------------------------------如何在一条语句中,查询出一个人员(如:personId=22)的信息呢?如同我们使用select name,age,email from 表 where personId=22 这样。有一些字段没有写出来。恳请高手点拨!!

解决方案 »

  1.   

    相当于把每个人员对应字段(也就是多条记录)的fieldValue的值查询出来,然后再组装成为一个name,age,email 的这种形式。
      

  2.   

    select wm_concat(fieldValue ) from t_content where personId=22
    order by fieldID
      

  3.   

    select 
    max(decode fieldId,1,fieldValue,null) as name,
    max(decode fieldId,2,fieldValue,null) as age,
    max(decode fieldId,3,fieldValue,null) as email
    from t_content
    where PersonId=22
      

  4.   

    写类似的这种查询语句,然后又和具体的数据库不相关(创建connection,sql语句在任何数据库中,都可以执行)。请问,如何处理呢?
      

  5.   


    那你得都用标准sql的了,比如oracle的如果用了decode,就要改成case when。而且很多函数都不能用的麻烦哟。
    还是提供几个不同版本的存储过程来实现吧。这样代码不用改了
      

  6.   


    1.建表结构如下:
      create table M
    (
      USER_ID     VARCHAR2(10),
      FIELD_NAME  VARCHAR2(10),
      FIELD_VALUE VARCHAR2(10)
    );2.sql
    select user_id,wm_concat(field_name||':'||field_value)
    from m
    group by user_id;