- 浏览: 248141 次
- 性别:
- 来自: 深圳
文章分类
最新评论
-
bit1129:
huanjia27 写道楼主, //数字小,优先级高 ...
PriorityBlockingQueue优先级规则 -
huanjia27:
楼主, //数字小,优先级高 public in ...
PriorityBlockingQueue优先级规则 -
bit1129:
优先级队列有点坑。。。对于返回的数组或者Iterator,对它 ...
PriorityBlockingQueue优先级规则 -
sun_2008:
再加一个参数cachePrepStmts=true才行,好像预 ...
Mysql是支持预编译的,只是默认没开启 -
hooray520:
nice~~
ThreadPoolExecutor线程池实现逻辑
SQL经典模式--列转行
一般需要将列转成行来使用,一定是原有的Schema设计没有考虑周全。但是没有办法,为了保护现有的投资,不得不在糟糕的设计上周旋,用最小的代价去实现新需求。
毕竟认识都是由浅入深,为不健全的Schema设计付出代价,就像交税一样,无可避免。
举例:
课程表: 每门课程由5位老师教,要求包含老师的信息,以及一些课程的信息
create table cource (id int, name varchar(100), teacher1 int,teacher2 int,teacher3 int, teacher4 int, teacher5 int);
insert into cource values (1,concat('Course_',round(rand()*300)),round(rand()*14),round(rand()*14),round(rand()*14),round(rand()*14),round(rand()*14));
insert into cource values (2,concat('Course_',round(rand()*300)),round(rand()*14),round(rand()*14),round(rand()*14),round(rand()*14),round(rand()*14));
insert into cource values (3,concat('Course_',round(rand()*300)),round(rand()*14),round(rand()*14),round(rand()*14),round(rand()*14),round(rand()*14));
insert into cource values (4,concat('Course_',round(rand()*300)),round(rand()*14),round(rand()*14),round(rand()*14),round(rand()*14),round(rand()*14));
insert into cource values (5,concat('Course_',round(rand()*300)),round(rand()*14),round(rand()*14),round(rand()*14),round(rand()*14),round(rand()*14));
insert into cource values (6,concat('Course_',round(rand()*300)),round(rand()*14),round(rand()*14),round(rand()*14),round(rand()*14),round(rand()*14));
insert into cource values (7,concat('Course_',round(rand()*300)),round(rand()*14),round(rand()*14),round(rand()*14),round(rand()*14),round(rand()*14));
insert into cource values (8,concat('Course_',round(rand()*300)),round(rand()*14),round(rand()*14),round(rand()*14),round(rand()*14),round(rand()*14));
insert into cource values (9,concat('Course_',round(rand()*300)),round(rand()*14),round(rand()*14),round(rand()*14),round(rand()*14),round(rand()*14));
insert into cource values (10,concat('Course_',round(rand()*300)),round(rand()*14),round(rand()*14),round(rand()*14),round(rand()*14),round(rand()*14));
insert into cource values (11,concat('Course_',round(rand()*300)),round(rand()*14),round(rand()*14),round(rand()*14),round(rand()*14),round(rand()*14));
insert into cource values (12,concat('Course_',round(rand()*300)),round(rand()*14),round(rand()*14),round(rand()*14),round(rand()*14),round(rand()*14));
老师表: 记录了每个老师的年龄,级别,性别
create table teacher(id int, age int, level int, gender int);
insert into teacher values (1, round(rand()*20+30), round(rand()*10), round(rand()*10)%2);
insert into teacher values (2, round(rand()*20+30), round(rand()*10), round(rand()*10)%2);
insert into teacher values (3, round(rand()*20+30), round(rand()*10), round(rand()*10)%2);
insert into teacher values (4, round(rand()*20+30), round(rand()*10), round(rand()*10)%2);
insert into teacher values (5, round(rand()*20+30), round(rand()*10), round(rand()*10)%2);
insert into teacher values (6, round(rand()*20+30), round(rand()*10), round(rand()*10)%2);
insert into teacher values (7, round(rand()*20+30), round(rand()*10), round(rand()*10)%2);
insert into teacher values (8, round(rand()*20+30), round(rand()*10), round(rand()*10)%2);
insert into teacher values (9, round(rand()*20+30), round(rand()*10), round(rand()*10)%2);
insert into teacher values (10, round(rand()*20+30), round(rand()*10), round(rand()*10)%2);
insert into teacher values (11, round(rand()*20+30), round(rand()*10), round(rand()*10)%2);
insert into teacher values (12, round(rand()*20+30), round(rand()*10), round(rand()*10)%2);
insert into teacher values (13, round(rand()*20+30), round(rand()*10), round(rand()*10)%2);
insert into teacher values (14, round(rand()*20+30), round(rand()*10), round(rand()*10)%2);
需求:
找出一些课程, 这些课程是由2位以上 男老师教,并且他们的级别大于3,并且他们年龄在40以下的。
一般过程性的方法:
先找出teacher表里面所有的teacherId (男老师教,并且他们的级别大于3,并且他们年龄在40),得到一个set
然后,把cource表加载到内存对象里面,然后开始循环,并用计数器去统计每个teacherId属性,看是否存在于set里面,如果存在就计数器+1, 计数器>3就跳出这条记录。
毫无疑问,以上的步骤还是比较的麻烦,估计一堆代码才理的清调理。
于是列转行的模式,就应运而生了。之所以称之为模式,是因为这样的问题场景实在是太常见了,就像在java里面要解决整个系统只用一个对象的问题而总结出了单例模式一样。
列转行需要一个工具表pivot,里面只有一列,存了1,2,3... , 你有多少个列需要转成行,就要多少个数。 我们这个例子是5
create table pivot (id int);
insert into pivot values (1),(2),(3),(4),(5);
步骤一: 放大结果集,一条记录复制5条, 然后对与每条记录,根据pivot.id只取一个teacherId值,得到一个临时表
select
c.id,
c.name,
case
when p.id=1 then c.teacher1
when p.id=2 then c.teacher2
when p.id=3 then c.teacher3
when p.id=4 then c.teacher4
when p.id=5 then c.teacher5
else 0
end
as teacherId
from cource c, pivot p
步骤二: 在临时表的基础上,再进行过滤(男老师教,并且他们的级别大于2,并且他们年龄在40),得到合适的结果集
select tmp.name from (
select
c.id,
c.name,
case
when p.id=1 then c.teacher1
when p.id=2 then c.teacher2
when p.id=3 then c.teacher3
when p.id=4 then c.teacher4
when p.id=5 then c.teacher5
else 0
end
as teacherId
from cource c, pivot p
) tmp where tmp.teacherId in (select id from teacher where age<40 and gender=1 and level>3)
步骤三: 分组统计,课程是由3位以上符合要求老师教的
select tmp.name from (
select
c.id,
c.name,
case
when p.id=1 then c.teacher1
when p.id=2 then c.teacher2
when p.id=3 then c.teacher3
when p.id=4 then c.teacher4
when p.id=5 then c.teacher5
else 0
end
as teacherId
from cource c, pivot p
) tmp where tmp.teacherId in (select id from teacher where age<40 and gender=1 and level>3)
group by tmp.name having count(*)>2
悲剧了,就是你还是在那里上班了。
一般需要将列转成行来使用,一定是原有的Schema设计没有考虑周全。但是没有办法,为了保护现有的投资,不得不在糟糕的设计上周旋,用最小的代价去实现新需求。
毕竟认识都是由浅入深,为不健全的Schema设计付出代价,就像交税一样,无可避免。
举例:
课程表: 每门课程由5位老师教,要求包含老师的信息,以及一些课程的信息
create table cource (id int, name varchar(100), teacher1 int,teacher2 int,teacher3 int, teacher4 int, teacher5 int);
insert into cource values (1,concat('Course_',round(rand()*300)),round(rand()*14),round(rand()*14),round(rand()*14),round(rand()*14),round(rand()*14));
insert into cource values (2,concat('Course_',round(rand()*300)),round(rand()*14),round(rand()*14),round(rand()*14),round(rand()*14),round(rand()*14));
insert into cource values (3,concat('Course_',round(rand()*300)),round(rand()*14),round(rand()*14),round(rand()*14),round(rand()*14),round(rand()*14));
insert into cource values (4,concat('Course_',round(rand()*300)),round(rand()*14),round(rand()*14),round(rand()*14),round(rand()*14),round(rand()*14));
insert into cource values (5,concat('Course_',round(rand()*300)),round(rand()*14),round(rand()*14),round(rand()*14),round(rand()*14),round(rand()*14));
insert into cource values (6,concat('Course_',round(rand()*300)),round(rand()*14),round(rand()*14),round(rand()*14),round(rand()*14),round(rand()*14));
insert into cource values (7,concat('Course_',round(rand()*300)),round(rand()*14),round(rand()*14),round(rand()*14),round(rand()*14),round(rand()*14));
insert into cource values (8,concat('Course_',round(rand()*300)),round(rand()*14),round(rand()*14),round(rand()*14),round(rand()*14),round(rand()*14));
insert into cource values (9,concat('Course_',round(rand()*300)),round(rand()*14),round(rand()*14),round(rand()*14),round(rand()*14),round(rand()*14));
insert into cource values (10,concat('Course_',round(rand()*300)),round(rand()*14),round(rand()*14),round(rand()*14),round(rand()*14),round(rand()*14));
insert into cource values (11,concat('Course_',round(rand()*300)),round(rand()*14),round(rand()*14),round(rand()*14),round(rand()*14),round(rand()*14));
insert into cource values (12,concat('Course_',round(rand()*300)),round(rand()*14),round(rand()*14),round(rand()*14),round(rand()*14),round(rand()*14));
老师表: 记录了每个老师的年龄,级别,性别
create table teacher(id int, age int, level int, gender int);
insert into teacher values (1, round(rand()*20+30), round(rand()*10), round(rand()*10)%2);
insert into teacher values (2, round(rand()*20+30), round(rand()*10), round(rand()*10)%2);
insert into teacher values (3, round(rand()*20+30), round(rand()*10), round(rand()*10)%2);
insert into teacher values (4, round(rand()*20+30), round(rand()*10), round(rand()*10)%2);
insert into teacher values (5, round(rand()*20+30), round(rand()*10), round(rand()*10)%2);
insert into teacher values (6, round(rand()*20+30), round(rand()*10), round(rand()*10)%2);
insert into teacher values (7, round(rand()*20+30), round(rand()*10), round(rand()*10)%2);
insert into teacher values (8, round(rand()*20+30), round(rand()*10), round(rand()*10)%2);
insert into teacher values (9, round(rand()*20+30), round(rand()*10), round(rand()*10)%2);
insert into teacher values (10, round(rand()*20+30), round(rand()*10), round(rand()*10)%2);
insert into teacher values (11, round(rand()*20+30), round(rand()*10), round(rand()*10)%2);
insert into teacher values (12, round(rand()*20+30), round(rand()*10), round(rand()*10)%2);
insert into teacher values (13, round(rand()*20+30), round(rand()*10), round(rand()*10)%2);
insert into teacher values (14, round(rand()*20+30), round(rand()*10), round(rand()*10)%2);
需求:
找出一些课程, 这些课程是由2位以上 男老师教,并且他们的级别大于3,并且他们年龄在40以下的。
一般过程性的方法:
先找出teacher表里面所有的teacherId (男老师教,并且他们的级别大于3,并且他们年龄在40),得到一个set
然后,把cource表加载到内存对象里面,然后开始循环,并用计数器去统计每个teacherId属性,看是否存在于set里面,如果存在就计数器+1, 计数器>3就跳出这条记录。
毫无疑问,以上的步骤还是比较的麻烦,估计一堆代码才理的清调理。
于是列转行的模式,就应运而生了。之所以称之为模式,是因为这样的问题场景实在是太常见了,就像在java里面要解决整个系统只用一个对象的问题而总结出了单例模式一样。
列转行需要一个工具表pivot,里面只有一列,存了1,2,3... , 你有多少个列需要转成行,就要多少个数。 我们这个例子是5
create table pivot (id int);
insert into pivot values (1),(2),(3),(4),(5);
步骤一: 放大结果集,一条记录复制5条, 然后对与每条记录,根据pivot.id只取一个teacherId值,得到一个临时表
select
c.id,
c.name,
case
when p.id=1 then c.teacher1
when p.id=2 then c.teacher2
when p.id=3 then c.teacher3
when p.id=4 then c.teacher4
when p.id=5 then c.teacher5
else 0
end
as teacherId
from cource c, pivot p
步骤二: 在临时表的基础上,再进行过滤(男老师教,并且他们的级别大于2,并且他们年龄在40),得到合适的结果集
select tmp.name from (
select
c.id,
c.name,
case
when p.id=1 then c.teacher1
when p.id=2 then c.teacher2
when p.id=3 then c.teacher3
when p.id=4 then c.teacher4
when p.id=5 then c.teacher5
else 0
end
as teacherId
from cource c, pivot p
) tmp where tmp.teacherId in (select id from teacher where age<40 and gender=1 and level>3)
步骤三: 分组统计,课程是由3位以上符合要求老师教的
select tmp.name from (
select
c.id,
c.name,
case
when p.id=1 then c.teacher1
when p.id=2 then c.teacher2
when p.id=3 then c.teacher3
when p.id=4 then c.teacher4
when p.id=5 then c.teacher5
else 0
end
as teacherId
from cource c, pivot p
) tmp where tmp.teacherId in (select id from teacher where age<40 and gender=1 and level>3)
group by tmp.name having count(*)>2
评论
11 楼
floatingleaf
2011-03-18
<p>首先更正LZ的一个英语单词的错误,课程不是cource 而是 Course。</p>
<p>还有对应建表语句,由于ORACLE 与 MYSQL的差别,现更正如下,(teache表也同样做相应的改动):</p>
<p>create table course (id int, name varchar(100), teacher1 int,teacher2 int,teacher3 int, teacher4 int, teacher5 int);</p>
<p> insert into course values (1,concat('Course_',round(sys.dbms_random.value(1,300))),round(sys.dbms_random.value(1,14)),round(sys.dbms_random.value(1,14)),round(sys.dbms_random.value(1,14)),round(sys.dbms_random.value(1,14)),round(sys.dbms_random.value(1,14)));<br> insert into course values (2,concat('Course_',round(sys.dbms_random.value(1,300))),round(sys.dbms_random.value(1,14)),round(sys.dbms_random.value(1,14)),round(sys.dbms_random.value(1,14)),round(sys.dbms_random.value(1,14)),round(sys.dbms_random.value(1,14)));<br> insert into course values (3,concat('Course_',round(sys.dbms_random.value(1,300))),round(sys.dbms_random.value(1,14)),round(sys.dbms_random.value(1,14)),round(sys.dbms_random.value(1,14)),round(sys.dbms_random.value(1,14)),round(sys.dbms_random.value(1,14)));<br> insert into course values (4,concat('Course_',round(sys.dbms_random.value(1,300))),round(sys.dbms_random.value(1,14)),round(sys.dbms_random.value(1,14)),round(sys.dbms_random.value(1,14)),round(sys.dbms_random.value(1,14)),round(sys.dbms_random.value(1,14)));<br> insert into course values (5,concat('Course_',round(sys.dbms_random.value(1,300))),round(sys.dbms_random.value(1,14)),round(sys.dbms_random.value(1,14)),round(sys.dbms_random.value(1,14)),round(sys.dbms_random.value(1,14)),round(sys.dbms_random.value(1,14)));<br> insert into course values (6,concat('Course_',round(sys.dbms_random.value(1,300))),round(sys.dbms_random.value(1,14)),round(sys.dbms_random.value(1,14)),round(sys.dbms_random.value(1,14)),round(sys.dbms_random.value(1,14)),round(sys.dbms_random.value(1,14)));<br> insert into course values (7,concat('Course_',round(sys.dbms_random.value(1,300))),round(sys.dbms_random.value(1,14)),round(sys.dbms_random.value(1,14)),round(sys.dbms_random.value(1,14)),round(sys.dbms_random.value(1,14)),round(sys.dbms_random.value(1,14)));<br> insert into course values (8,concat('Course_',round(sys.dbms_random.value(1,300))),round(sys.dbms_random.value(1,14)),round(sys.dbms_random.value(1,14)),round(sys.dbms_random.value(1,14)),round(sys.dbms_random.value(1,14)),round(sys.dbms_random.value(1,14)));<br> insert into course values (9,concat('Course_',round(sys.dbms_random.value(1,300))),round(sys.dbms_random.value(1,14)),round(sys.dbms_random.value(1,14)),round(sys.dbms_random.value(1,14)),round(sys.dbms_random.value(1,14)),round(sys.dbms_random.value(1,14)));<br> insert into course values (10,concat('Course_',round(sys.dbms_random.value(1,300))),round(sys.dbms_random.value(1,14)),round(sys.dbms_random.value(1,14)),round(sys.dbms_random.value(1,14)),round(sys.dbms_random.value(1,14)),round(sys.dbms_random.value(1,14)));<br> insert into course values (11,concat('Course_',round(sys.dbms_random.value(1,300))),round(sys.dbms_random.value(1,14)),round(sys.dbms_random.value(1,14)),round(sys.dbms_random.value(1,14)),round(sys.dbms_random.value(1,14)),round(sys.dbms_random.value(1,14)));<br> insert into course values (12,concat('Course_',round(sys.dbms_random.value(1,300))),round(sys.dbms_random.value(1,14)),round(sys.dbms_random.value(1,14)),round(sys.dbms_random.value(1,14)),round(sys.dbms_random.value(1,14)),round(sys.dbms_random.value(1,14)));<br><br>-- DELETE TABLE course;<br> --DROP TABLE course;<br> COMMIT;</p>
<p>还有对应建表语句,由于ORACLE 与 MYSQL的差别,现更正如下,(teache表也同样做相应的改动):</p>
<p>create table course (id int, name varchar(100), teacher1 int,teacher2 int,teacher3 int, teacher4 int, teacher5 int);</p>
<p> insert into course values (1,concat('Course_',round(sys.dbms_random.value(1,300))),round(sys.dbms_random.value(1,14)),round(sys.dbms_random.value(1,14)),round(sys.dbms_random.value(1,14)),round(sys.dbms_random.value(1,14)),round(sys.dbms_random.value(1,14)));<br> insert into course values (2,concat('Course_',round(sys.dbms_random.value(1,300))),round(sys.dbms_random.value(1,14)),round(sys.dbms_random.value(1,14)),round(sys.dbms_random.value(1,14)),round(sys.dbms_random.value(1,14)),round(sys.dbms_random.value(1,14)));<br> insert into course values (3,concat('Course_',round(sys.dbms_random.value(1,300))),round(sys.dbms_random.value(1,14)),round(sys.dbms_random.value(1,14)),round(sys.dbms_random.value(1,14)),round(sys.dbms_random.value(1,14)),round(sys.dbms_random.value(1,14)));<br> insert into course values (4,concat('Course_',round(sys.dbms_random.value(1,300))),round(sys.dbms_random.value(1,14)),round(sys.dbms_random.value(1,14)),round(sys.dbms_random.value(1,14)),round(sys.dbms_random.value(1,14)),round(sys.dbms_random.value(1,14)));<br> insert into course values (5,concat('Course_',round(sys.dbms_random.value(1,300))),round(sys.dbms_random.value(1,14)),round(sys.dbms_random.value(1,14)),round(sys.dbms_random.value(1,14)),round(sys.dbms_random.value(1,14)),round(sys.dbms_random.value(1,14)));<br> insert into course values (6,concat('Course_',round(sys.dbms_random.value(1,300))),round(sys.dbms_random.value(1,14)),round(sys.dbms_random.value(1,14)),round(sys.dbms_random.value(1,14)),round(sys.dbms_random.value(1,14)),round(sys.dbms_random.value(1,14)));<br> insert into course values (7,concat('Course_',round(sys.dbms_random.value(1,300))),round(sys.dbms_random.value(1,14)),round(sys.dbms_random.value(1,14)),round(sys.dbms_random.value(1,14)),round(sys.dbms_random.value(1,14)),round(sys.dbms_random.value(1,14)));<br> insert into course values (8,concat('Course_',round(sys.dbms_random.value(1,300))),round(sys.dbms_random.value(1,14)),round(sys.dbms_random.value(1,14)),round(sys.dbms_random.value(1,14)),round(sys.dbms_random.value(1,14)),round(sys.dbms_random.value(1,14)));<br> insert into course values (9,concat('Course_',round(sys.dbms_random.value(1,300))),round(sys.dbms_random.value(1,14)),round(sys.dbms_random.value(1,14)),round(sys.dbms_random.value(1,14)),round(sys.dbms_random.value(1,14)),round(sys.dbms_random.value(1,14)));<br> insert into course values (10,concat('Course_',round(sys.dbms_random.value(1,300))),round(sys.dbms_random.value(1,14)),round(sys.dbms_random.value(1,14)),round(sys.dbms_random.value(1,14)),round(sys.dbms_random.value(1,14)),round(sys.dbms_random.value(1,14)));<br> insert into course values (11,concat('Course_',round(sys.dbms_random.value(1,300))),round(sys.dbms_random.value(1,14)),round(sys.dbms_random.value(1,14)),round(sys.dbms_random.value(1,14)),round(sys.dbms_random.value(1,14)),round(sys.dbms_random.value(1,14)));<br> insert into course values (12,concat('Course_',round(sys.dbms_random.value(1,300))),round(sys.dbms_random.value(1,14)),round(sys.dbms_random.value(1,14)),round(sys.dbms_random.value(1,14)),round(sys.dbms_random.value(1,14)),round(sys.dbms_random.value(1,14)));<br><br>-- DELETE TABLE course;<br> --DROP TABLE course;<br> COMMIT;</p>
10 楼
nicholasun
2011-03-16
交叉表的思路不行么?
9 楼
yangleisx
2011-03-15
加95443740 一起学习java
8 楼
fq_jeid
2011-03-11
这个应该用的很多
7 楼
Vicent_Lee
2011-03-11
前一阵子去面试的一家公司就是考了这样的题目\不过还好\我答上来了
6 楼
tiantianshagn
2011-03-10
谢谢。。
5 楼
glamey
2011-03-10
dolwenjian 写道
现在上班的公司面试题好像就有这个。。。TMD 还是要手写。。结果哥 悲剧了!!
悲剧了,就是你还是在那里上班了。
4 楼
280511772
2011-03-09
冗余表。。物化视图
3 楼
dolwenjian
2011-03-09
现在上班的公司面试题好像就有这个。。。TMD 还是要手写。。结果哥 悲剧了!!
2 楼
zzhonghe
2011-02-28
冗余表确实是个好办法,只是维护起来有点费力。
上面的子查询在执行计划中显示会开启一个临时表(Extra: Using temporary),如果需要转的记录很少,比如上面加上courceId<5,那么就无所谓了,只转一条,效率不会影响,冗余表提升空间相当小。
但如果要转的记录非常多,而且非常频繁,那么临时表的开销就是相当大(加载表相关记录的内容到临时表,并且是N*列数),由于临时表无法使用到索引,查询的速度会非常慢, 这时采用冗余的方式就非常好。
上面的子查询在执行计划中显示会开启一个临时表(Extra: Using temporary),如果需要转的记录很少,比如上面加上courceId<5,那么就无所谓了,只转一条,效率不会影响,冗余表提升空间相当小。
但如果要转的记录非常多,而且非常频繁,那么临时表的开销就是相当大(加载表相关记录的内容到临时表,并且是N*列数),由于临时表无法使用到索引,查询的速度会非常慢, 这时采用冗余的方式就非常好。
1 楼
xieye
2011-02-28
行列转换还有一个思路,就是建冗余表,而不是临时表,这是为了查询速度。
然后,每做什么修改,两个表都要改。
然后,每做什么修改,两个表都要改。
发表评论
-
用sqoop从Hive to Mysql导数
2015-12-29 11:53 1443hive和mysql分别建表如下: hive> ... -
hive和hbase的联合表
2015-12-29 11:04 838在hive中创建表: 主键,账户状态,余额,同时定义好其在h ... -
Hive行列转换
2015-05-07 09:07 760行列转换在ETL中是非常常见的场景,Hive中也毫不意外的 ... -
Hive编程指南读书笔记
2015-05-07 09:01 19191. MapReduce的任务, Map之后,会进行排序, ... -
Oracle的表
2014-03-05 11:05 1361堆表 -- 普通表 99%的应 ... -
Oracle的Redo和Undo
2014-03-05 09:06 1768延迟段创建: create table的时候,并没有真 ... -
Oracle的事务
2014-03-04 10:31 1185显式调用 编写Oracle程 ... -
Oracle的锁
2014-03-04 08:57 759Oracle的锁是行锁,实现方式是在块上进行标识锁状态,因此 ... -
Oracle的并发和多版本控制
2014-03-03 22:27 1340写不会阻塞读,这是Oracle和其他数据库的一个根本的区别。 ... -
Oracle的并发和多版本控制
2014-03-03 21:59 1写不会阻塞读,这是Ora ... -
SQL性能调优技巧
2014-02-28 23:49 1047Data Model设计的Tip 1. 以三个范式为 ... -
开发Oracle数据库应用的正确和不正确的方法
2012-10-04 17:52 1042看书的目的在于深入理解Oracle到底能做什么,尽量多的学习O ... -
11g新特性 pivot&unpivot 的行列转换
2012-09-10 23:24 1151笔记如下: --求所有BR中,曾经有大于2次状态是Close ... -
11g新特性 递归子查询 替代 Connect by
2012-09-10 21:46 1178在这个例子里面,关于history的记录,每条记录都有一个pr ... -
排序内存不够导致IO操作频繁的调优
2012-09-09 10:54 1684--找到当前进程的SID select sid from v$ ... -
嵌套join和HashJoin以及Hash索引
2012-09-08 12:47 1701嵌套join和Hash Join 首先 ... -
SQL经典模式 - 行转列
2011-02-27 11:12 1512不知道读者有没有类似的遭遇,遇到下面这样的设计: #雇员信息 ... -
Mysql中模拟rownum完成行列转换
2011-02-26 16:49 2305环境: create table ff(f1 varcah ... -
用单条SQL优化流程化的统计过程
2011-02-25 11:09 1380最近是一次成功优化的体验,把原来流程化的Java+N条SQL的 ... -
Insert语句的几个提高效率的特殊用法
2011-02-24 19:03 12882我们做Insert操作的,经常要判断insert的条件是否满足 ...
相关推荐
精典的SQL语句,行转列,列转行的语句 本文共分六个部分,分别讨论精典的SQL语句,行转列,列转行的语句,行列转换、取得数据表的所有列名、更改用户密码、判断表的哪些字段不允许为空、找到含有相同字段的表六个...
在本篇文章中,我们将深入探讨SQL的Unpivot函数,以及如何使用它来实现列转行的操作。 首先,让我们回顾一下上一篇文章中提到的Pivot函数。Pivot函数是用于将数据的行转换为列,通常用于数据透视或汇总,使得特定的...
- 列转行:使用UNPIVOT或其他数据库函数将列数据转换为行数据。 - 将结果集反向转置为一列:将多行数据合并为单个字段。 - 抑制结果集中的重复值:使用DISTINCT关键字。 - 利用“行转列”进行计算:在转换后的...
有时会遇到没有遵守第一范式设计模式的业务表。即一列中存储了多个属性值。如下表 pk value 1 ET,AT 2 AT,BT 3 AT,DT 4 DT,CT,AT 一般有这两种常见需求(测试数据见文末) 1.得到所有的不重复的值,...
Oracle数据库提供了多种方法来实现这种转换,本篇将详细介绍如何在Oracle中进行行列转换,包括列转行、行转列以及各种复杂场景下的转换。 1. 列转行 列转行主要是将数据库表中的多列数据转换为多行数据。在Oracle...
#### 六、列转行组件——Normalizer Transformation **简要说明** Normalizer Transformation 用于将多列转换为多行,适用于需要将宽格式数据转换为长格式数据的场景。 **组件配置** 1. **组件选择**: 选择 ...
- 更新操作通过`RowUpdating`事件完成,从编辑模式下的行获取新的字段值,并构建相应的更新SQL语句执行。 #### 3. GridView正反双向排序 - **功能简介**:实现GridView的升序与降序双向排序。 - **实现方法**: ...
为了增强用户体验,可以通过CSS或JavaScript实现鼠标悬停时更改行背景色的效果。CSS方法较为简单,只需设置`:hover`伪类即可。而JavaScript方法提供了更多的定制选项,例如动画效果或渐变过渡。 #### 7. GridView...