最近のトラックバック

最近のコメント

2017年3月
      1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31  
無料ブログはココログ

« 2008年5月 | トップページ | 2008年9月 »

2008年6月

2008年6月13日 (金)

行移行と行連鎖

あいまいだったので整理。

連鎖:一行が複数ブロックにまたがって格納されている状態

で、連鎖は以下の2つ、行移行と行連鎖に分かれる。

行移行:
 発生条件:更新によりレコードの長さが拡張し、現在そのレコードが格納されているブロック内に収まる事が出来なくなった場合
 現象:別のブロックにレコードが移行し、元の場所には移行元のROWIDが残される

行連鎖:
 発生条件:1レコードの長さが1ブロックに収まらない場合
  ※なんか項目(列)が多い+項目長が長い、という組み合わせで発生するケースだけど、たとえばブロックサイズを8KBとしたとき、8KB(正確には違いますが)以上の長さのレコードってすごくないですか?TMの佐藤さんが見たらダメダシ間違いなし

2008年6月11日 (水)

行(レコード)を列(カラム)として表示

これも、行(レコード)を列(カラム)として表示するやり方。
ありがとうTom!

Ask Tom "Column to rows"

質問をした人は、こんなふうにUNIONするやり方を紹介。
CREATE TABLE rows_to_column AS
SELECT * FROM (
SELECT field_cnst, field_1 FROM table1 t1 WHERE field_cnst IN (SELECT fnm_ln_id FROM table2) UNION ALL
SELECT field_cnst, field_2 FROM table1 t1 WHERE field_cnst IN (SELECT fnm_ln_id FROM table2) UNION ALL
SELECT field_cnst, field_3 FROM table1 t1 WHERE field_cnst IN (SELECT fnm_ln_id FROM table2) UNION ALL
SELECT field_cnst, field_4 FROM table1 t1 WHERE field_cnst IN (SELECT fnm_ln_id FROM table2) UNION ALL
SELECT field_cnst, field_5 FROM table1 t1 WHERE field_cnst IN (SELECT fnm_ln_id FROM table2) UNION ALL
SELECT field_cnst, field_6 FROM table1 t1 WHERE field_cnst IN (SELECT fnm_ln_id FROM table2) UNION ALL
SELECT field_cnst, field_7 FROM table1 t1 WHERE field_cnst IN (SELECT fnm_ln_id FROM table2) UNION ALL
SELECT field_cnst, field_8 FROM table1 t1 WHERE field_cnst IN (SELECT fnm_ln_id FROM table2) UNION ALL
SELECT field_cnst, field_9 FROM table1 t1 WHERE field_cnst IN (SELECT fnm_ln_id FROM table2) UNION ALL
SELECT field_cnst, field_10 FROM table1 t1 WHERE field_cnst IN (SELECT fnm_ln_id FROM table2) UNION ALL
SELECT field_cnst, field_11 FROM table1 t1 WHERE field_cnst IN (SELECT fnm_ln_id FROM table2) UNION ALL
SELECT field_cnst, field_12 FROM table1 t1 WHERE field_cnst IN (SELECT fnm_ln_id FROM table2) UNION ALL
SELECT field_cnst, field_13 FROM table1 t1 WHERE field_cnst IN (SELECT fnm_ln_id FROM table2) UNION ALL
SELECT field_cnst, field_14 FROM table1 t1 WHERE field_cnst IN (SELECT fnm_ln_id FROM table2) UNION ALL
SELECT field_cnst, field_15 FROM table1 t1 WHERE field_cnst IN (SELECT fnm_ln_id FROM table2) UNION ALL
SELECT field_cnst, field_16 FROM table1 t1 WHERE field_cnst IN (SELECT fnm_ln_id FROM table2) UNION ALL
SELECT field_cnst, field_17 FROM table1 t1 WHERE field_cnst IN (SELECT fnm_ln_id FROM table2) UNION ALL
SELECT field_cnst, field_18 FROM table1 t1 WHERE field_cnst IN (SELECT fnm_ln_id FROM table2) UNION ALL
SELECT field_cnst, field_19 FROM table1 t1 WHERE field_cnst IN (SELECT fnm_ln_id FROM table2) UNION ALL
SELECT field_cnst, field_20 FROM table1 t1 WHERE field_cnst IN (SELECT fnm_ln_id FROM table2) ) src

一方Tomの回答は、

scott%ORA10GR2> create or replace view vw
  2  as
  3  select to_char(empno) f1,
  4         ename f2,
  5             to_char(hiredate) f3,
  6             to_char(sal) f4,
  7             to_char(comm) f5,
  8             job f6,
  9             deptno field_cnst
10    from scott.emp;

View created.

scott%ORA10GR2>
scott%ORA10GR2> with data
  2  as
  3  (select level C from dual connect by level <= 6)
  4  select case C when 1 then f1 when 2 then f2 when 3 then f3 when 4 then f4 when 5
then f5 when 6 then f6 end val
  5    from vw, data
  6   where field_cnst in (select deptno from scott.dept)
  7  /

VAL
----------------------------------------
ANALYST

20182.53
09-DEC-82
SCOTT
7788
CLERK

800
17-DEC-80
SMITH
7369
SALESMAN
300
1600
20-FEB-81
ALLEN
7499
SALESMAN
500
....

Googleの技術ドキュメント日本語化

Google Japan Blog: 日本のデベロッパーの要望に応え、多くの技術ドキュメントを日本語化しました

そうです。

2008年6月 6日 (金)

行と列を入替える

モトネタはこちら
Ask Tom "Yup, ANOTHER Rows to Columns (or vice-versa) question. Sorry.", version 9.2.0

こういうデータに対して
TestID   Name      Phone
------- -------    ----------
1      John     1234567
2      Peter    9876543

こんなふうにしたい
Row1     Row2
--------    ----------
1         2
John       Peter
1234567    9876543

けど、こうなっちゃう↓という質問に対して
Row1     Row2
--------    ----------
1        NULL
John      NULL
1234567   NULL
NULL     2
NULL     Peter
NULL     9876543

Tomの回答は、
10g以前だと

ops$tkyte%ORA9IR2> select rw,

  2         max(decode( rn, 1, decode( rw, 1, to_char(testid), 2, name, 3, phone) )) r1,
  3         max(decode( rn, 2, decode( rw, 1, to_char(testid), 2, name, 3, phone) )) r2
  4    from (select testid, name, phone, row_number() over (order by testid) rn
  5            from test),
  6         (select level RW from dual connect by level <= 3)
  7   group by rw
  8  /

        RW           R1             R2
---------- ---------- ----------
         1              1              2
         2           John          Peter
         3         1234567     9876543

 

11gだと、pivot/unpivot関数を使って

ops$tkyte%ORA11GR1> with data
  2  as
  3  (
  4  select rn, data, thing
  5    from (select to_char(testid) testid, name, phone, to_char(rownum) rn from test )
  6     unpivot ( data for thing in ( testid , name, phone) )
  7  )
  8  select thing, row1, row2
  9    from data
10  pivot( max(data) for rn in ( '1' as row1, '2' as row2 ))
11  /

THING  ROW1         ROW2
------ ---------- ----------
TESTID 1                2
PHONE  1234567      9876543
NAME   John            Peter

2008年6月 5日 (木)

「Windowsは崩壊するしかないのか?」

ガートナーのレポートとして
Windowsは崩壊するしかないのか? - TechTargetジャパン

<BLOCKQUOTE>
MicrosoftのWindowsは自らの重みで崩壊の危機にあり、劇的に変わらなければ時代遅れになりかねない。しかし、Windowsは変わっても変わらなくてもうまくいかない──。米調査会社Gartnerのアナリスト、マイケル・シルバー、ニール・マクドナルドの両氏はこう指摘した。
</BLOCKQUOTE>

2008年6月 4日 (水)

「大学生のためのFirefoxアドオン 50+ - あまたの何かしら。」

まだ全部みてはいないけど、メモメモ

大学生のためのFirefoxアドオン 50+ - あまたの何かしら。

« 2008年5月 | トップページ | 2008年9月 »