查看: 15531|回复: 19

关于标量子查询的问题(TOM大师不小心都犯错了)

[复制链接]
认证徽章
论坛徽章:
50
2014年世界杯参赛球队: 荷兰
日期:2014-07-11 07:56:59蛋疼蛋
日期:2012-03-06 07:22:542012新春纪念徽章
日期:2012-02-13 15:09:522012新春纪念徽章
日期:2012-02-13 15:09:522012新春纪念徽章
日期:2012-02-13 15:09:522012新春纪念徽章
日期:2012-02-13 15:09:522012新春纪念徽章
日期:2012-02-13 15:09:522012新春纪念徽章
日期:2012-01-04 11:53:29蛋疼蛋
日期:2011-11-11 15:47:00ITPUB十周年纪念徽章
日期:2011-11-01 16:23:26
发表于 2010-8-18 10:37 | 显示全部楼层 |阅读模式
本帖最后由 wabjtam123 于 2013-5-18 06:57 编辑

呵呵,发现TOM的高效设计都出错了,贴出来发给大家看看,怕我自己搞错了,所以事先请教NEWKID兄,
经过大侠NEWKID兄的确认和指点后,我才坚信TOM大师也犯错了


背景案例:

开发人员完成一SQL如下:
SELECT TF.FLOW_ID 流程ID,
       TF.FLOW_NAME 流程名称,
       TFM.FLOW_NAME 流程模板名称,
       STAFF1.STAFF_NAME  流程创建人名称,
       STAFF2.STAFF_NAME   流程状态员工,
       TF.CREATE_DATE 创建日期,
       TF.STATE 流程状态名称,
       TF.STATE_DATE 流程状态日期,
       TT.TCH_ID 环节ID,
       TT.TCH_NAME 环节名称,
       TT.TCH_MOD 环节类型名称,
       TT.PERSON 接收任务员工,
       TT.TCH_CONT_DESC 环节内容,
       TT.RESULT_ID 环节执行结果,
       TT.LATE_REASON 影响本环节原因,
       STAFF3.STAFF_NAME   环节执行人,
       TT.SLA_DATE 考核时间点,
       TT.SLA_TIME 考核时间,
       TT.CREATED_DATE 环节创建日期,
       TT.BEGIN_DATE 环节启动日期,
       TT.FINISH_DATE 环节结束日期,
       TT.STATE 环节状态名称,
       NVL2(TT.SUB_FLOW_ID,
            (SELECT TF.FLOW_NAME
               FROM FLOW TF
              WHERE TF.FLOW_ID = TT.SUB_FLOW_ID
                AND TF.FLOW_ID = TT.FLOW_ID),
            0) 子流程名称
  FROM FLOW TF,TACHE TT,FLOW_MODEL TFM,STAFF STAFF1 ,STAFF STAFF2,STAFF STAFF3
WHERE TF.FLOW_ID = TT.FLOW_ID
   AND TF.BEGIN_TCH_ID = TT.TCH_ID
   AND TF.FLOW_MOD = TFM.FLOW_MOD
   AND TF.STAFF_ID=STAFF1.STAFF_ID
   AND TF.STATE_STAFF=STAFF2.STAFF_ID
   AND TT.STAFF_ID=STAFF3.STAFF_ID

后来,开发人员将上述语句修改为标量子查询,具体如下。

SELECT TF.FLOW_ID 流程ID,
       TF.FLOW_NAME 流程名称,
       TFM.FLOW_NAME 流程模板名称,
       (SELECT STAFF_NAME FROM STAFF TS WHERE TS.STAFF_ID = TF.STAFF_ID) 流程创建人名称,
       (SELECT STAFF_NAME FROM STAFF TS WHERE TS.STAFF_ID = TF.STATE_STAFF) 流程状态员工,
       TF.CREATE_DATE 创建日期,
       TF.STATE 流程状态名称,
       TF.STATE_DATE 流程状态日期,
       TT.TCH_ID 环节ID,
       TT.TCH_NAME 环节名称,
       TT.TCH_MOD 环节类型名称,
       TT.PERSON 接收任务员工,
       TT.TCH_CONT_DESC 环节内容,
       TT.RESULT_ID 环节执行结果,
       TT.LATE_REASON 影响本环节原因,
       (SELECT STAFF_NAME FROM STAFF TS WHERE TS.STAFF_ID = TT.STAFF_ID) 环节执行人,
       TT.SLA_DATE 考核时间点,
       TT.SLA_TIME 考核时间,
       TT.CREATED_DATE 环节创建日期,
       TT.BEGIN_DATE 环节启动日期,
       TT.FINISH_DATE 环节结束日期,
       TT.STATE 环节状态名称,
       NVL2(TT.SUB_FLOW_ID,
            (SELECT TF.FLOW_NAME
               FROM FLOW TF
              WHERE TF.FLOW_ID = TT.SUB_FLOW_ID
                AND TF.FLOW_ID = TT.FLOW_ID),
            0) 子流程名称
  FROM FLOW TF,TACHE TT,FLOW_MODEL TFM
WHERE TF.FLOW_ID = TT.FLOW_ID
   AND TF.BEGIN_TCH_ID = TT.TCH_ID
   AND TF.FLOW_MOD = TFM.FLOW_MOD


问题来了,这两种写法等价吗?
其实是不等价的!
如果TF.STAFF_ID可能为空,必须该用外连接才等价,另一个TT.STAF_ID 也是如此!
------------------------------------------------------------------------------------------------------------------------

我们可以试验如下:

DROP TABLE TEST111;
CREATE TABLE TEST111 (ID INT );
INSERT  INTO TEST111 VALUES (1);
INSERT  INTO TEST111 VALUES (2);
INSERT  INTO TEST111 VALUES (3);
COMMIT;
DROP TABLE TEST222;
CREATE TABLE TEST222 (ID INT );
INSERT  INTO TEST222 VALUES (1);
INSERT  INTO TEST222 VALUES (2);
INSERT  INTO TEST222 VALUES (NULL);
COMMIT;


如下两种写法等价
SELECT T1.ID ,(SELECT T2.ID FROM TEST222 T2 WHERE ID=T1.ID)
FROM TEST111 T1;


                                     ID (SELECTT2.IDFROMTEST222T2WHERE
--------------------------------------- ------------------------------
                                      1                              1
                                      2                              2
                                      3
                                      
                                      
SELECT T1.ID ,T2.ID FROM TEST111 T1 ,TEST222 T2 WHERE T1.ID=T2.ID(+)

SQL> SELECT T1.ID ,T2.ID FROM TEST111 T1 ,TEST222 T2 WHERE T1.ID=T2.ID(+);

                                     ID                                      ID
--------------------------------------- ---------------------------------------
                                      1                                       1
                                      2                                       2
                                      3

如果不写成外连接,将不等价

SQL> SELECT T1.ID ,T2.ID FROM TEST111 T1 ,TEST222 T2 WHERE T1.ID=T2.ID;

                                     ID                                      ID
--------------------------------------- ---------------------------------------
                                      1                                       1
                                      2                                       2
        
        
        
        
-----------------------------------------------------------------------------------------------------------------------               
转入正题,查阅TOM的高效设计,学习TOM的标量子查询的这一章节。发现世界级大师不小心也犯错了,我发现TOM的高效设计中涉及到标量子查询的地方有两处BUG  

                                    
第1处错误:                                      
第8章,390页处如下脚本,写法有误

如下脚本在执行过程会报ORA-01427: 单行子查询返回多个行的错误

select object_type,
       object_name,
       decode(status, 'INVALID', '*', '') status,
       decode(object_type,
              'TABLE',
              (select tablespace_name
                 from user_tables
                where table_name = object_name),
              'TABLE PARTITION',
              (select tablespace_name
                 from user_tab_partitions
                where partition_name = subobject_name),
              'INDEX',
              (select tablespace_name
                 from user_indexes
                where index_name = object_name),
              'INDEX PARTITION',
              (select tablespace_name
                 from user_ind_partitions
                where partition_name = subobject_name),
              'LOB',
              (select tablespace_name
                 from user_segments
                where segment_name = object_name),
              null) tablespace_name
  from user_objects a
order by object_type, object_name

其中查找脚本出错的方法可将SQL改造为如下后发现原因
SELECT *
  FROM (select object_type,
               object_name,
               subobject_name,
               decode(status, 'INVALID', '*', '') status,
               decode(object_type,
                      'TABLE',
                      (select COUNT(*)
                         from user_tables
                        where table_name = object_name),
                      'TABLE PARTITION',
                      (select COUNT(*)
                         from user_tab_partitions
                        where  partition_name = subobject_name),
                      'INDEX',
                      (select COUNT(*)
                         from user_indexes
                        where index_name = object_name),
                      'INDEX PARTITION',
                      (select COUNT(*)
                         from user_ind_partitions
                        where partition_name = subobject_name),
                      'LOB',
                      (select COUNT(*)
                         from user_segments
                        where segment_name = object_name),
                      null) CNT
          from user_objects a
         order by object_type, object_name)
WHERE CNT > 1

如下查询结果可知user_tab_partitions和user_ind_partitions部分关联user_objects后返回了多条记录!

OBJECT_TYPE         OBJECT_NAME                          SUBOBJECT_NAME     STATUS        CNT
------------------- ------------------------------------ ------------------ ------ ----------
INDEX PARTITION     BIN$CMOKJKViStmNxTg7xMcerw==$0       P3                                 4
INDEX PARTITION     BIN$CMOKJKViStmNxTg7xMcerw==$0       P1                                 4
INDEX PARTITION     BIN$CMOKJKViStmNxTg7xMcerw==$0       P2                                 4
INDEX PARTITION     BIN$VaNYTNQDTwCUGLznTySTTQ==$0       P2                                 4
INDEX PARTITION     BIN$VaNYTNQDTwCUGLznTySTTQ==$0       P1                                 4
INDEX PARTITION     BIN$VaNYTNQDTwCUGLznTySTTQ==$0       P3                                 4
INDEX PARTITION     BIN$omlhPKACRIuWVFt3q9Yl/A==$0       P2                                 4
INDEX PARTITION     BIN$omlhPKACRIuWVFt3q9Yl/A==$0       P3                                 4
INDEX PARTITION     BIN$omlhPKACRIuWVFt3q9Yl/A==$0       P1                                 4
INDEX PARTITION     IDX_TAB1                             P2                                 4
INDEX PARTITION     IDX_TAB1                             P1                                 4
INDEX PARTITION     IDX_TAB1                             P3                                 4
TABLE PARTITION     BIN$12P24K0NSsyE26Qw1UmD0g==$0       P3                                12
TABLE PARTITION     BIN$12P24K0NSsyE26Qw1UmD0g==$0       P1                                12
TABLE PARTITION     BIN$12P24K0NSsyE26Qw1UmD0g==$0       P2                                12
TABLE PARTITION     BIN$6FIF7ZkBRF6GU120ostiWw==$0       P1                                12
TABLE PARTITION     BIN$6FIF7ZkBRF6GU120ostiWw==$0       P3                                12
TABLE PARTITION     BIN$6FIF7ZkBRF6GU120ostiWw==$0       P2                                12
TABLE PARTITION     BIN$DQPZK/0eQbaYEt0BZ1s/Mg==$0       P3                                12
TABLE PARTITION     BIN$DQPZK/0eQbaYEt0BZ1s/Mg==$0       P2                                12
TABLE PARTITION     BIN$DQPZK/0eQbaYEt0BZ1s/Mg==$0       P1                                12
TABLE PARTITION     BIN$O9jKeQ63Qx6GagrHewYrVQ==$0       P2                                12
TABLE PARTITION     BIN$O9jKeQ63Qx6GagrHewYrVQ==$0       P3                                12
TABLE PARTITION     BIN$O9jKeQ63Qx6GagrHewYrVQ==$0       P1                                12
TABLE PARTITION     BIN$QNX8vccsSM+fpTBZJYN42g==$0       P3                                12
TABLE PARTITION     BIN$QNX8vccsSM+fpTBZJYN42g==$0       P2                                12
TABLE PARTITION     BIN$QNX8vccsSM+fpTBZJYN42g==$0       P1                                12
TABLE PARTITION     BIN$lxLXtRKkSgW4kmMo60MyRA==$0       P1                                12
TABLE PARTITION     BIN$lxLXtRKkSgW4kmMo60MyRA==$0       P2                                12
TABLE PARTITION     BIN$lxLXtRKkSgW4kmMo60MyRA==$0       P3                                12
TABLE PARTITION     BIN$o2PkS10LQ5Gl+yYu2lSkGg==$0       P1                                12
TABLE PARTITION     BIN$o2PkS10LQ5Gl+yYu2lSkGg==$0       P3                                12
TABLE PARTITION     BIN$o2PkS10LQ5Gl+yYu2lSkGg==$0       P2                                12
TABLE PARTITION     BIN$vPEKh0mZQ9KenijFQ/9URQ==$0       P2                                12
TABLE PARTITION     BIN$vPEKh0mZQ9KenijFQ/9URQ==$0       P3                                12
TABLE PARTITION     BIN$vPEKh0mZQ9KenijFQ/9URQ==$0       P1                                12
TABLE PARTITION     FANGXC12                             P2                                12
TABLE PARTITION     FANGXC12                             P1                                12
TABLE PARTITION     FANGXC12                             P3                                12
TABLE PARTITION     PART_TAB1                            P3                                12
TABLE PARTITION     PART_TAB1                            P2                                12
TABLE PARTITION     PART_TAB1                            P1                                12
TABLE PARTITION     PART_TAB2                            P1                                12
TABLE PARTITION     PART_TAB2                            P3                                12
TABLE PARTITION     PART_TAB2                            P2                                12
TABLE PARTITION     PART_TAB3                            P3                                12
TABLE PARTITION     PART_TAB3                            P2                                12
TABLE PARTITION     PART_TAB3                            P1                                12

48 rows selected

而修改为加上table_name = a.object_name等后,则无重复记录

SELECT *
  FROM (select object_type,
               object_name,
               subobject_name,
               decode(status, 'INVALID', '*', '') status,
               decode(object_type,
                      'TABLE',
                      (select COUNT(*)
                         from user_tables
                        where table_name = object_name),
                      'TABLE PARTITION',
                      (select COUNT(*)
                         from user_tab_partitions
                        where  table_name = a.object_name
                        AND    partition_name = subobject_name),
                      'INDEX',
                      (select COUNT(*)
                         from user_indexes
                        where index_name = object_name),
                      'INDEX PARTITION',
                      (select COUNT(*)
                         from user_ind_partitions
                        where partition_name = subobject_name
                        and INDEX_NAME = A.OBJECT_NAME),
                      'LOB',
                      (select COUNT(*)
                         from user_segments
                        where segment_name = object_name),
                      null) CNT
          from user_objects a
         order by object_type, object_name)
WHERE CNT > 1

OBJECT_TYPE         OBJECT_NAME                                                                      SUBOBJECT_NAME                 STATUS        CNT
------------------- -------------------------------------------------------------------------------- ------------------------------ ------ ----------


因此最终代码应修正为如下:

select object_type,
       object_name,
       decode(status, 'INVALID', '*', '') status,
       decode(object_type,
              'TABLE',
              (select tablespace_name
                 from user_tables
                where table_name = object_name),
              'TABLE PARTITION',
              (select tablespace_name
                 from user_tab_partitions
                where table_name = a.object_name
                  AND partition_name = subobject_name),
              'INDEX',
              (select tablespace_name
                 from user_indexes
                where index_name = object_name),
              'INDEX PARTITION',
              (select tablespace_name
                 from user_ind_partitions
                where partition_name = subobject_name
                  and INDEX_NAME = A.OBJECT_NAME),
              'LOB',
              (select tablespace_name
                 from user_segments
                where segment_name = object_name),
              null) tablespace_name
  from user_objects a
order by object_type, object_name


注:会产生这个原因主要是因为分区表时候各个分区表都可以用相同的分区名,比如都可以用P1,P2..,所以要加上表名才唯一,TOM不小心忽略了这一点了,这个问题和ORACLE的版本无关。
create table part_tab1 (id int)
    partition by range (id)
    (
    partition p1 values less than (10),
    partition p2 values less than (20),
    partition p3 values less than (maxvalue)
    )
    ;
create table part_tab2 (id int)
    partition by range (id)
    (
    partition p1 values less than (10),
    partition p2 values less than (20),
    partition p3 values less than (maxvalue)
    )
    ;
create index idx_part_tab1 on part_tab1(id) local;
create index idx_part_tab2 on part_tab2(id) local;






第2处错误,第8章的384页
TOM说如下两个语句等价,其实不等价

select a.username, count(*)
  from all_users a, all_objects b
where a.username = b.owner (+)
group by a.username;

select a.username,
      (select count(*) from all_objects b where b.owner = a.username) cnt
from all_users a

简单试验即可得知,一边为1,一边查询结果为0:

SQL> select  username,count(*) from a, b where a.username=b.owner(+) group by a.username order by username;

USERNAME                         COUNT(*)
------------------------------ ----------
AAA                                     1
ANONYMOUS                               1
BOSSWG                                  1
CTXSYS                                339
DBSNMP                                 46
DIP                                     1
DMSYS                                 189
EXFSYS                                281
LJB                                   272
LJB1                                    1
LJB2                                    1
MDDATA                                  1
MDSYS                                 885
MGMT_VIEW                               1
OLAPSYS                               720
ORDPLUGINS                             10
ORDSYS                               1669
OUTLN                                   8
SCOTT                                   6
SI_INFORMTN_SCHEMA                      8
SYS                                 22979
SYSMAN                               1321
SYSTEM                                454
TSMSYS                                  3
WMSYS                                 242
XDB                                   680
YXL                                     2

27 rows selected
SQL> SELECT username,(select count(*) from b where b.owner=a.username) cnt  from a order by username;
USERNAME                              CNT
------------------------------ ----------
AAA                                     0
ANONYMOUS                               0
BOSSWG                                  0
CTXSYS                                339
DBSNMP                                 46
DIP                                     0
DMSYS                                 189
EXFSYS                                281
LJB                                   272
LJB1                                    0
LJB2                                    0
MDDATA                                  0
MDSYS                                 885
MGMT_VIEW                               0
OLAPSYS                               720
ORDPLUGINS                             10
ORDSYS                               1669
OUTLN                                   8
SCOTT                                   6
SI_INFORMTN_SCHEMA                      8
SYS                                 22979
SYSMAN                               1321
SYSTEM                                454
TSMSYS                                  3
WMSYS                                 242
XDB                                   680
YXL                                     2
27 rows selected




前面COUNT(*) 是错的,哪怕b表没数据,至少也会返回一行。COUNT(连接键)的写法才对

--如下才是等价的!


select a.username, count(owner)
  from all_users a, all_objects b
where a.username = b.owner (+)
group by a.username;

select a.username,
      (select count(*) from all_objects b where b.owner = a.username) cnt
from all_users a




要特别注意,只有在左连接的时候,这个写法才和标量子查询等价,如下两种切记是不等价的,
可以回顾一下文章开头开发人员的案例从而进一步加深印象。

select a.username, count(owner)
  from all_users a, all_objects b
where a.username = b.owner
group by a.username;

select a.username,
      (select count(*) from all_objects b where b.owner = a.username) cnt
from all_users a

感谢大家支持和认可,TOM大师也会出错,看来这还真是易错点啊,希望此贴能帮到更多的人!
此外也请大家多关注一下俺的《收获,不止Oracle》了,这是我自认为写的最棒的一本书了,哈哈。请买时顺便写点书评
书第一次印刷后的一周时间,即第二次印刷了,真给力!
京东:http://book.jd.com/11220905.html
当当:http://product.dangdang.com/product.aspx?product_id=23224719
再次感谢!




认证徽章
论坛徽章:
69
奥运会纪念徽章:射击
日期:2016-09-06 23:08:25马上有车
日期:2014-02-19 11:55:14马上有车
日期:2014-02-18 16:41:112014年新春福章
日期:2014-02-18 16:41:112013年新春福章
日期:2013-02-25 14:51:24复活蛋
日期:2013-02-18 11:25:01迷宫蛋
日期:2012-12-25 17:17:41复活蛋
日期:2012-12-21 17:41:38奥运会纪念徽章:沙滩排球
日期:2012-10-27 14:59:31ITPUB 11周年纪念徽章
日期:2012-10-09 18:03:32
发表于 2010-8-18 10:55 | 显示全部楼层

使用道具 举报

回复
论坛徽章:
1088
金色在线徽章
日期:2007-04-25 04:02:08金色在线徽章
日期:2007-06-29 04:02:43金色在线徽章
日期:2007-03-11 04:02:02在线时间
日期:2007-04-11 04:01:02在线时间
日期:2007-04-12 04:01:02在线时间
日期:2007-03-07 04:01:022008版在线时间
日期:2010-05-01 00:01:152008版在线时间
日期:2011-05-01 00:01:342008版在线时间
日期:2008-06-03 11:59:43ITPUB年度最佳技术原创精华奖
日期:2013-03-22 13:18:30
发表于 2010-8-18 10:57 | 显示全部楼层
tom大师经典的高效设计也犯了不小的错误啊,标量子查询的确容易犯返回多行的错误,用在select 里要小心。与外联接等价,这个到没有考虑过。一般标量子查询也就放在where中:
select ...
from tab where col >(select max(col) from tab);类似这样的

wj研究的深入,

使用道具 举报

回复
论坛徽章:
32
祖国60周年纪念徽章
日期:2009-10-09 08:28:002013年新春福章
日期:2013-02-25 14:51:24迷宫蛋
日期:2013-06-28 11:09:23ITPUB季度 技术新星
日期:2013-07-30 16:04:58优秀写手
日期:2013-12-18 09:29:132014年新春福章
日期:2014-02-18 16:43:09马上有钱
日期:2014-02-18 16:43:09红孩儿
日期:2014-03-04 16:40:38美羊羊
日期:2015-02-16 16:36:28懒羊羊
日期:2015-03-04 14:52:11
发表于 2010-8-18 13:26 | 显示全部楼层
一般标量子查询最好是能够确定其唯一性,不然出错是迟早的,而且最好是一些小表。

使用道具 举报

回复
论坛徽章:
8
授权会员
日期:2008-09-01 09:46:23祖国60周年纪念徽章
日期:2009-10-09 08:28:002010新春纪念徽章
日期:2010-01-04 08:33:082010年世界杯参赛球队:加纳
日期:2010-05-27 09:47:352011新春纪念徽章
日期:2011-01-04 10:26:43奥运会纪念徽章:花样游泳
日期:2012-06-26 09:57:17ITPUB 11周年纪念徽章
日期:2012-10-09 18:08:152013年新春福章
日期:2013-02-25 14:51:24
发表于 2010-8-18 22:03 | 显示全部楼层
佩服

使用道具 举报

回复
认证徽章
论坛徽章:
187
状元
日期:2016-04-28 14:18:17榜眼
日期:2016-04-28 14:18:17探花
日期:2016-04-28 14:18:17进士
日期:2016-04-28 14:18:17举人
日期:2016-04-28 14:18:17红宝石
日期:2012-04-13 17:18:06蓝锆石
日期:2012-02-20 12:20:11紫水晶
日期:2012-04-19 12:49:17祖母绿
日期:2012-02-27 22:10:14海蓝宝石
日期:2012-02-27 16:58:24
发表于 2010-8-18 22:06 | 显示全部楼层
好细心。

使用道具 举报

回复
论坛徽章:
540
奥运会纪念徽章:垒球
日期:2008-09-15 01:28:12生肖徽章2007版:鸡
日期:2008-11-17 23:40:58生肖徽章2007版:马
日期:2008-11-18 05:09:48数据库板块每日发贴之星
日期:2008-11-29 01:01:02数据库板块每日发贴之星
日期:2008-12-05 01:01:03生肖徽章2007版:虎
日期:2008-12-10 07:47:462009新春纪念徽章
日期:2009-01-04 14:52:28数据库板块每日发贴之星
日期:2009-02-08 01:01:03生肖徽章2007版:蛇
日期:2009-03-09 22:18:532009日食纪念
日期:2009-07-22 09:30:00
发表于 2010-8-18 22:09 | 显示全部楼层
瑕不掩瑜,这本书非常有价值,不知道什么时候TOM会出第二版。
我想挑一些章节翻译,但是怕有版权问题一直没动手。

使用道具 举报

回复
认证徽章
论坛徽章:
50
2014年世界杯参赛球队: 荷兰
日期:2014-07-11 07:56:59蛋疼蛋
日期:2012-03-06 07:22:542012新春纪念徽章
日期:2012-02-13 15:09:522012新春纪念徽章
日期:2012-02-13 15:09:522012新春纪念徽章
日期:2012-02-13 15:09:522012新春纪念徽章
日期:2012-02-13 15:09:522012新春纪念徽章
日期:2012-02-13 15:09:522012新春纪念徽章
日期:2012-01-04 11:53:29蛋疼蛋
日期:2011-11-11 15:47:00ITPUB十周年纪念徽章
日期:2011-11-01 16:23:26
发表于 2010-8-19 06:09 | 显示全部楼层
原帖由 newkid 于 2010-8-18 22:09 发表
瑕不掩瑜,这本书非常有价值,不知道什么时候TOM会出第二版。
我想挑一些章节翻译,但是怕有版权问题一直没动手。


NEWKID兄,在国外呆的人版权意识就是强,
这本真是好书,读完后非常有收获。
不过其中的标量子查询,TOM说会快,其实我觉的我类似的试验做过好多次了,都感觉快的不明显!
另外标量子查询的执行计划很隐晦,难以细节深入的研究。

使用道具 举报

回复
论坛徽章:
69
生肖徽章2007版:羊
日期:2008-11-14 14:42:19复活蛋
日期:2011-08-06 08:59:05ITPUB十周年纪念徽章
日期:2011-11-01 16:19:412012新春纪念徽章
日期:2012-01-04 11:49:542012新春纪念徽章
日期:2012-02-13 15:13:202012新春纪念徽章
日期:2012-02-13 15:13:202012新春纪念徽章
日期:2012-02-13 15:13:202012新春纪念徽章
日期:2012-02-13 15:13:202012新春纪念徽章
日期:2012-02-13 15:13:20版主4段
日期:2012-05-15 15:24:11
发表于 2010-8-19 12:38 | 显示全部楼层
原帖由 newkid 于 2010-8-18 22:09 发表
瑕不掩瑜,这本书非常有价值,不知道什么时候TOM会出第二版。
我想挑一些章节翻译,但是怕有版权问题一直没动手。

唉, 英文不好, 要不我也去买一份来看了.

使用道具 举报

回复
论坛徽章:
1088
金色在线徽章
日期:2007-04-25 04:02:08金色在线徽章
日期:2007-06-29 04:02:43金色在线徽章
日期:2007-03-11 04:02:02在线时间
日期:2007-04-11 04:01:02在线时间
日期:2007-04-12 04:01:02在线时间
日期:2007-03-07 04:01:022008版在线时间
日期:2010-05-01 00:01:152008版在线时间
日期:2011-05-01 00:01:342008版在线时间
日期:2008-06-03 11:59:43ITPUB年度最佳技术原创精华奖
日期:2013-03-22 13:18:30
发表于 2010-8-19 13:01 | 显示全部楼层
原帖由 nyfor 于 2010-8-19 12:38 发表

唉, 英文不好, 要不我也去买一份来看了.

有中文版的啊,这个中文版的翻译的还可以的

使用道具 举报

回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

TOP技术积分榜 社区积分榜 徽章 团队 统计 知识索引树 积分竞拍 文本模式 帮助
  ITPUB首页 | ITPUB论坛 | 数据库技术 | 企业信息化 | 开发技术 | 微软技术 | 软件工程与项目管理 | IBM技术园地 | 行业纵向讨论 | IT招聘 | IT文档
  ChinaUnix | ChinaUnix博客 | ChinaUnix论坛
CopyRight 1999-2011 itpub.net All Right Reserved. 北京盛拓优讯信息技术有限公司版权所有 联系我们 
京ICP备09055130号-4  北京市公安局海淀分局网监中心备案编号:11010802021510 广播电视节目制作经营许可证:编号(京)字第1149号
  
快速回复 返回顶部 返回列表