若天明 发表于 2015-1-16 22:27:40

MSSQL网站制作之SQL Story摘录(八)――――数据抽取

mysqld进程在一个写入当中被杀死;计算机的意外关闭(例如,如果计算机掉电);一个硬件错误。数据
数据抽取

实际上的干系型数据库,数据是以干系的情势存在。一般我们都能够把它们视为一种汇合。如许,数据通常为以无序的情势存在的。这类做法的优点自不必多加会商了,不外我们也得供认,偶然如许也会带给我们一些贫苦。我比来就碰到这么一件。

我在网上赶上我的一个老同砚,他提出了如许一个成绩。有一个表(假定就叫myTable),表中有三个整型字段(假定就叫A11,A12,A13),其上有一个独一键束缚。如今他想要在这个表的数据中取一些样品。他但愿从中A13的各个取值中,各取一笔记录。然后我问他,对A11和A12有甚么请求吗?他说,没有,怎样取都能够,有无纪律都行。我想固然的说,复杂,给我二非常钟。

有一个笑话不知你们听过没有。说好久之前,一个年夜数学家授课,有先生问他能不克不及证实四色定理。他说,那简单,我如今就证给你们……然后他写啊写啊……想啊想啊……一向想到下课也没证出来,然后表面打了一个年夜年夜的响雷,他自嘲说,天主也被我的傲慢激愤了……

甚么,你问我方才的成绩怎样了?我告知你,二非常种,不不,四非常钟,不不,仿佛是一个小时……厥后到三更了,表面入手下手打雷……我对我的同砚说,老兄,我错了,让我把这成绩拿归去想一想先……

以下是一个示例,我任意录了些数据出来

A11A12A13

---------------------------------

000

001

011

111

112

122

222

221

223

213

233

331

332

323

321

322

311

312

313

一入手下手,我是想用一个SELECTMAX(A11),MAX(A12),A13FROMmyTableGROUPBYA13,厥后用脚指头想了想,发明不成能。由于MAX(A11)和MAX(A12)都只依附于分组子句GROUPBYA13。明显如许MAX(A11)和MAX(A12)纷歧定会是统一笔记录中的数据。就像上面如许:

A13

---------------------------------

000

331

332

333

注重,实在3,3,3这一行是不存在的。

然后我想,SELECTMAX(A11),MAX(A12),A13FROMmyTableGROUPBYA13,A12行不可?用SQLServer试了试,也不合错误。由于如许的话,它会先按A13,A12来分组所前往的了局集,以是会比我们要的数据多的多。就像上面如许

A13

---------------------------------

000

001

311

312

313

321

322

323

331

332

233

诸云云类的傻事我还干了良多,厥后我终究想分明我要甚么数据了:取A12,A13,使得在一切按A13的值分组后,取每组中最年夜的A12,然后取整纪录,使得A11是A12和A13满意前述前提后的最年夜的一个值。如许,我写出了一个语句:

SELECT

(SELECTMAX(I.A11)FROMmyTableIWHEREI.A13=O.A13ANDI.A12=MAX(O.A12))A11

,MAX(O.A12)A12

,O.A13A13

FROMmyTableO

GROUPBYO.A13

这行语句前往值以下:

A11A12A13

---------------------------------

000

331

332

233

一样的,我们能够注释它为最两个了局集,一个是SELECTMAX(A11),MAX(A12),A13FROMmyTableGROUPBYA13,一个是SELECTMAX(A12),A13FROMmyTableGROUPBYA13,A12,然所按A12和A13举行等值连接,这就是:

SELECTMAX(L.A11)A11

,MAX(L.A12)A12

,L.A13A13

FROMmyTableL

JOINmyTableR

ONL.A13=R.A13

GROUPBYL.A13,L.A12

HAVINGL.A12=MAX(R.A12)

我个以为如许子对照清新,不知列位觉得怎样?

现实上,这一类的数据抽取,不成能用一个复杂查询失掉,由于个中有一个字段要同时参予分组和统计。只要(现实上是只需)把我们的成绩用SQL言语的思索体例形貌分明,谜底也就失掉了,统统就这么复杂。

关于一类完整按行随机抽取的成绩,除化为Topn成绩办理外,另有一个好主张就是在撑持物理行号的数据库体系中,用rowid或标识列之类的手艺来办理,如许对照复杂,就未几说了。

增补一句,之前我说过InterBase不撑持主动标识列,但实践上,它也能够直接的完成。在InterBase中,我们能够Create一种叫generator的全局变量,然后用一个触发器,分离一个函数叫GEN_ID的,就能够做到。虽然说有点贫苦,但并不是不成能。具体情形,人人能够查询InterBase有关手艺文档。

接待来信和我会商手艺成绩:lx1978@263.net。
我们分析上面的两个操作,都有一个“删除数据”的过程。

山那边是海 发表于 2015-1-19 13:11:24

我们学到了什么?思考问题的时候从表的角度来思考问

第二个灵魂 发表于 2015-1-19 13:11:24

现在是在考虑:如果写到服务器端,我一下搞他个10个存储过程导过去,那久之服务器不就成垃圾箱了吗?即便优化了我的中间层.

海妖 发表于 2015-1-25 17:35:27

一个百万级别的基本信息表A,一个百万级别的详细记录表B,A中有个身份证id,B中也有身份id;先要找出A中在B的详细记录。

变相怪杰 发表于 2015-2-3 12:12:03

SP4是一个累积性的ServicePack,包含自以前的ServicePack发布以来所有的修补程序(包括MS03-031安全公告)。

小魔女 发表于 2015-2-8 21:25:59

至于淘汰的问题,只能说在你的项目周期之内,微软应该都不会倒闭。

金色的骷髅 发表于 2015-2-26 11:03:39

呵呵,这就是偶想说的

若天明 发表于 2015-3-8 14:04:57

习惯敲命令行的朋友可能会爽一些。但是功能有限。适合机器跑不动SQLServerManagementStudio的朋友使用。

冷月葬花魂 发表于 2015-3-16 02:32:48

记得在最开始使用2k的时候就要用到这个功能,可惜2k没有,现在有了作解决方案的朋友会很高兴吧。

分手快乐 发表于 2015-3-22 19:09:37

是要和操作系统进行Socket通讯的场景。否则建议慎重!

透明 发表于 2015-3-22 19:09:40

大家注意一点。如下面的例子:
页: [1]
查看完整版本: MSSQL网站制作之SQL Story摘录(八)――――数据抽取