查询效果编号 项1 项2 项3 录入时间
1 10 10 10 2010-06-04
2 20 20 23 2010-06-05
列(项)数量是不固定的,可以有用户自定义添加
请问各位前辈,数据库表怎么设计好,如何查询出来这种效果?
1 10 10 10 2010-06-04
2 20 20 23 2010-06-05
列(项)数量是不固定的,可以有用户自定义添加
请问各位前辈,数据库表怎么设计好,如何查询出来这种效果?
解决方案 »
- 用pl/sql删除所有表
- DDL怎么回滚?
- oracle删除大量数据后,变慢的问题
- 关于oracle的一个简单问题
- 求对一个允许重复记录的表做统计,对于重复的记录sum的时候只要算1个,内详!
- 初学oracle用什么书好啊
- 大家谈谈使用oracle9i中的随机帮助的感受,我感觉很不爽
- 没有用过触发器!
- 请问,我在unix上用connect internal/oracle联接后,它总是报insufficient privileges,这是为什么?
- kettle求助: 抽取数据时连接重置Connection reset
- 大家好,大家帮我看一下这个sql语句怎么写啊?
- 求助:sql按顶级部门统计人员组成语句写法
用 execute immediate 执行么
表设计成这样可以,之后用decode函数显示查询效果吧
做法有点像订单和订单明细
要三张表才能表达出来喔
主 id 别名 changedtime intime
从 主id 项名id 值 intime
项字典 id 项名 分类要给主表加字段,就都加到字典表里去
插入时,首先创建主表唯一记录,按照字典或者分类,列出给用户填数据的项,如果某项是没有数据,则可不插入到从表中。
查询时,按照项字典生成查询列,然后查从表中的数据填入到对应的列中。
还可以动态按照分类或者用户选择字典中的某几项,作为列,查询从表的记录。
就是复杂点
1 10 10 10 2010-06-04
2 20 20 23 2010-06-05
如果说是项1,项2是不确定的 我的理解是可以设计三张表
一张 编号表
编号 录入时间
1 2010-06-04
2 2010-06-05
一张 项表 项id为主键
项id 项值
1 10
2 10
3 10
4 20
一张 编号项关系表 关系id主键
关系表id 编号 项id
1 1 1
2 1 2
3 1 3
create table a(
a_id NUMBER(20) primary key not null,
a_date DATE);create table b(
b_id NUMBER(20) not null,
b_col VARCHAR2(10), --放列名
b_val VARCHAR2(40), --列名对应的列值
constraint CFK foreign key(b_id) references a(a_id));create or replace
PROCEDURE ADD_AB_DATA
(v_id in a.A_ID%TYPE,v_col_val in B.B_VAL%TYPE,v_date in a.A_DATE%TYPE)
AS
v_num NUMBER;
TYPE v_array IS TABLE OF VARCHAR2(30);
v_col v_array := v_array();
v_val v_array := v_array();
i NUMBER DEFAULT 1;
j NUMBER DEFAULT 1;
k NUMBER DEFAULT 0;
BEGIN
v_num:=length(v_col_val)-length(replace(v_col_val,':',''));
insert into a values(v_id,v_date);
FOR i IN 1..v_num LOOP
j := instr(v_col_val,':',1,i);
v_col.extend;
v_val.extend;
v_col(i) := SUBSTR(v_col_val,k+1,j-k-1);
k := instr(v_col_val,',',1,i);
IF i < v_num THEN
v_val(i) := SUBSTR(v_col_val,j+1,k-j-1);
ELSE
v_val(i) := SUBSTR(v_col_val,j+1,length(v_col_val)-j);
END IF;
dbms_output.put_line('v_col('||i||') = '||v_col(i));
dbms_output.put_line('v_val('||i||') = '||v_val(i));
insert into b values(v_id,v_col(i), v_val(i));
END LOOP;
commit;
--insert into a values(v_id,v_date);END ADD_AB_DATA;exec add_ab_data(1,'name:tracy,sex:girl,phone:55445','05-MAY-2010');
--插入数据显示数据要在前台程序端写,把B表的b_col做为列名,再将与期对应的b_val做为列值.
但因为楼主需求不明确,在插入数据时,要保证每次列值和列数都一样,一个表中,每行的列数不同,是不可以的.只能多建几个表