• 締切済み

SQL:全テーブルの現在のデータ数を知りたい。

環境 DBサーバ : Linux + Oracle9i  クライアント : WindowsXP + Oracle10g の SQLPlus(w) 当方SQL初心者です。以下のSelectを行うSQL文がわかりません。(色々悪戦苦闘しましたが) どなたかご教授下さい。 条件指定する TABLESPACE_NAME に属する、全テーブルの現在のデータ数を、 各テーブルに comment on したコメントと一緒に表示するSQLを教えて下さい。 Select 結果のイメージは以下の感じです。 TABLESPACE_NAME TABLE_NAME Count(*)    Comments ------------------ -------------- ----------- -------------------- 条件としては、  (1) where TABLESPACE_NAME like 'xxxx%' です。 そして TABLESPACE_NAME が異なれば、同じ TABLE_NAME のテーブルがありますが (1)の条件に合致する全てのテーブルを Select したいということです。 すみませんが、お分かりの方、宜しくお願い致します。

  • Oracle
  • 回答数3
  • ありがとう数3

みんなの回答

  • muyoshid
  • ベストアンサー率72% (230/318)
回答No.3

こんにちわ。 > やはりSQL1文ではチョット無理なようですね。 SQL 文1つでは無理ですが、ちょっと工夫すればこんな感じでできます。 SQL> select owner, count(*) from dba_tables where tablespace_name = 'SYSAUX' group by owner; OWNER COUNT(*) --------------- ---------- SYSTEM 24 DBSNMP 16 APPQOSSYS 4 SYS 297 上記のような状態で以下のようなスクリプト (count.sql) を用意します。 [count.sql] -------------------------------------------------------------------------------- set pages 1000 set lines 180 set echo off set feedback off set heading off set verify off set termout off set trimspool on col sql_txt format a170 col cmd format a100 spool count1.sql select 'set pages 100' as cmd, 'set lines 100' as cmd, 'set echo off' as cmd, 'set feedback off' as cmd, 'col owner format a15' as cmd, 'col table_name format a30' as cmd, 'col tablespace_name format a15' as cmd, 'col cnt format 99999999' as cmd from dual; select 'select ' || chr(39) || owner || chr(39) || ' as owner, ' || chr(39) || table_name || chr(39) || ' as table_name, ' || chr(39) || tablespace_name || chr(39) || ' as tablespace_name, ' || 'count(*) as cnt from ' || owner || '.' || table_name || ';' as sql_txt from dba_tables where owner = user and tablespace_name = upper('&1') order by table_name; select 'exit' as cmd from dual; spool off set heading on set termout on @count1.sql exit -------------------------------------------------------------------------------- これを、以下のように実行してやると SYSTEM スキーマ (ログイン名) が 所有者でSYSAUX 表領域 (パラメータ) にあるテーブルの一覧が取得できます。 $ sqlplus system/manager @count.sql sysaux 最終的に実行しているSQL は、count1.sql (count.sql で作成しています) を 確認して下さい。

corgifun
質問者

お礼

muyoshidさん。 再度の回答、ありがとうございます。 またお礼の返事が遅くなってすみません。 なるほど、スクリプトからSQLのテキストを出力して実行させるのですね。 初めて知りましたし、大変参考になりました。 前回教えて頂いた NUM_ROWS でなんとかやっていましたが こちらのスクリプトの方法に変更しようと思います。 いつもお世話になり、ありがとうございました。

  • muyoshid
  • ベストアンサー率72% (230/318)
回答No.2

こんにちわ。 > create table Def_01.DEVICE_TBL > ( > ・・・・中略・・・・ > ) tablespace Def_01 ; Create table で指定している「Def_01.DEVICE_TBL」ですが、 SQL の構文では[スキーマ名].テーブル名 となります。 以下に、Oracle9.2 のSQL リファレンスがあるので確認してみて下さい。 http://otndnld.oracle.co.jp/document/oracle9i/920/generic/server/J06261-02.pdf

参考URL:
http://otndnld.oracle.co.jp/document/oracle9i/920/generic/server/J06261-02.pdf
corgifun
質問者

お礼

muyoshidさん。 再度のご指導、ありがとうございます。 確かにご指摘の通りです。 またまた説明漏れで申し訳ありません。 補足致しますと、別途下記SQLで Oracleユーザーを作成しています。 create user Def_01 identified by xxxxxx default tablespace Def_01 temporary tablespace DEF_01Tmp ; 紛らわしくてすみません。 今後とも宜しくお願い致します。

  • muyoshid
  • ベストアンサー率72% (230/318)
回答No.1

こんにちわ。 > 条件指定する TABLESPACE_NAME に属する、全テーブルの現在のデータ数を、 > 各テーブルに comment on したコメントと一緒に表示するSQLを教えて下さい。 単純なSQL では難しいですね。 やるとすれば、以下の2つの方法がありますが。 1) テーブルをAnalyze して、ALL_TABLES.NUM_ROWS から件数を取得する。 2) ALL_TABLES から欲しい表領域に属するテーブル全てを COUNT(*) するスクリプトを作成して実行する。 きちんとAnalyze していて、多少件数がブレても問題ないのであれば、 ALL_TABLES.NUM_ROWS から件数を取得するのが楽ですね。 > TABLESPACE_NAME が異なれば、同じ TABLE_NAME のテーブルがありますが これは、Partitioning の事でしょうか? Partitioning であれば、表領域は異なる必要はありません。 スキーマが同じであれば、表領域が異なる同名のテーブルは作成できません。

corgifun
質問者

お礼

muyoshidさん。 早速の回答、ありがとうございます。 やはりSQL1文ではチョット無理なようですね。 なるほど、Analize して、ALL_TABLES.NUM_ROWS から取得するという方法ですね。 概略の件数でOKなので、これが簡単なような気がします。早速明日試してみます。 > TABLESPACE_NAME が異なれば、同じ TABLE_NAME のテーブルがありますが... とは、Partitioning のような高度な機能ではなく、単に世代管理のように、同じテーブル名で、 複数のテーブルスペースに作表しています。 例として、create tablespace と createテーブルの SQL文を下記に掲載しますと。 create tablespace Def_01 ・・・・中略・・・・ segment space management auto ; create tablespace Def_02 ・・・・中略・・・・ segment space management auto ; ---------------------------------- create table Def_01.DEVICE_TBL ( ・・・・中略・・・・ ) tablespace Def_01 ; create table Def_02.DEVICE_TBL ( ・・・・中略・・・・ ) tablespace Def_02 ; のような感じです。 説明不足ですみません。 

関連するQ&A

  • 表と表領域とデータファイルについて

    よろしくお願いします。 表と表領域とデータファイルの関係を一発で導く方法を 教えてください。 今のところ、下記2つに分けているので、1つのSQLとしたいです。 データベースは、Oracle9i(9.2.0.8.0)です。 どうぞよろしくお願いします。 1. ------------------------------ SQL> select table_name, tablespace_name from all_all_tables 2 where table_name = 'SAMPLE' 3 ; ------------------------------ 2. ------------------------------ SQL> select tablespace_name, file_name from DBA_DATA_FILES 2 where tablespace_name = 'USERS' 3 ; ------------------------------

  • Acess2003で複雑なSQL?

    Access2003で以下のSQLを実行させることはできるのでしょうか? 直接SQLで実行する方法と、Access独特の両方で実行する方法が知りたいです。 select name, count(*) from テーブル group by name order by 2 desc;

  • 年齢分布テーブルの再集計SQL

    テーブルA 年齢,人数 20,15 21,11 22,26 .... 30,5 31,88 ... 60,5 上記テーブルAからのSQLで下記のデータが欲しいと思っております。 【欲しい結果】 年齢範囲,人数 20~24,50 25~29,33 30~34,199 ... ただし、 select '20~24'as 年齢範囲,count(*)as 人数 from テーブルA where 条件1 union select '25~29'as 年齢範囲,count(*)as 人数 from テーブルA where 条件2 union select '30~34'as 年齢範囲,count(*)as 人数 from テーブルA where 条件3 ... というSQLは使いたくないです。(テーブルAの記述が長めなので、同じものを複数記述したくないのです) また結果が 項目名:20~24,25~29,30~34,... レコード:50,33,199,... というのも遠慮したいです。 CASE文やsum、groupを使えば、できそうな気がするのですが、、、 ご教授お願い致します。

  • 一つのSQLにできませんか??

    表領域のサイズと使用量を抽出するSQLを作成しています。 上は自動拡張サイズと現サイズを抽出するSQL、下は現在の使用量を抽出するSQLです。この二つを一つのSQLで作成ってできないでしょうか?? (1)自動拡張と現サイズを算出 select sysdate syoribi, a.tablespace_name, to_char(sum(a.MAXBYTES)/1024/1024, '999,999,990') jidou, to_char(sum(a.BYTES)/1024/1024, '9,999,990.9') gensaize from dba_data_files a group by a.tablespace_name (2)使用量を算出 select sysdate syoribi, b.tablespace_name, to_char(sum(b.BYTES)/1024/1024, '9,999,990.9') siyoryo from dba_segments b group by b.tablespace_name どうかよろしくお願いします。

  • SQL 件数取得を速くしたい

    SQLでテーブルなどからSELECTされた件数を得る際に、 select count(*) from ~ 等とするかと思いますが、この結果が返ってくるのが遅くて困っています。 少しでも速く件数を得たいのですがどのような方法がありますでしょうか? 教えてください。 私が使っている環境はOracle 8iで 特に今回はgroup byを含むビューからの検索を行おうとしています。

  • SQL WHERE文のノットイコールについて

    初歩的な質問ですみません。 Oracle9iでsqlplusで接続しています。 「member_accountテーブルのdelete_flag(VARCHAR2)カラムの値が'1'ではない」ものを抽出したいと考えてます。 ただ、正しい結果が返ってきません。 何が問題でしょうか?よろしくお願いいたします。 ============================================================ SQL> select count(ID) from member_account; COUNT(ID) ---------- 16450 SQL> SQL> select count(ID) from member_account where delete_flag='1'; COUNT(ID) ---------- 107 SQL> SQL> select count(ID) from member_account where delete_flag<>'1'; COUNT(ID) ---------- 0 SQL> SQL> select count(ID) from member_account where delete_flag!='1'; COUNT(ID) ---------- 0 ============================================================ よろしくお願いいたします。

  • SQLの書き方

    select A.NO, A.NAME, count(B.TEN) FROM T1 A, T2 B GROUP BY A.NO ORDER BY 3 DESC 結果として以下のようになってほしいのですが、どのようにSQLを書けばよいのでしょうか? 結果 NO | NAME | TEN ---+------+----- 3 + 上村 + 40 1 + 吉田 + 11 2 + 浅野 + 6 T1テーブル NO | NAME ---+-------- 1 + 吉田 2 + 浅野 3 + 上村 T2テーブル NO | TEN ---+-------- 1 + 10 2 + 5 3 + 0 1 + 1 2 + 1 3 + 40

  • SQLについて

    SELECT COUNT( * ) FROM テーブル1で出たデータを別テーブルの数量に書き込みたいのですがどういう風にSQLを書けばいいですか??

  • データの件数を集計するための SQL

    データの件数を集計するための SQL について教えてください。 例えば以下のようなテーブルがあります。 ▼テーブル 名前 |交通手段|日付 -----+--------+---- Aさん|バス |5/1 Aさん|バス |5/2 Aさん|バス |5/3 Bさん|バス |5/1 Bさん|電車 |5/2 ※「日付」については、本質問に直接の関係はありません。 このテーブルにクエリを発行して、以下の結果を取得したいと考えています。 ▼取得したい結果 名前 |交通手段|回数 -----+--------+---- Aさん|バス |3 Bさん|バス |1 Bさん|電車 |1 当方がイメージしている流れは以下の通りです。 SQL は苦手でして、これをひとつにまとめることができません。 1) GROUP BY で束ねる SELECT 名前, 交通手段 FROM テーブル GROUP BY 名前, 交通手段 2) 1)の結果の1件目をSELECTする SELECT COUNT(*) FROM テーブル WHERE 名前='Aさん' AND 交通手段='バス' 3) 1)の結果の2件目をSELECTする SELECT COUNT(*) FROM テーブル WHERE 名前='Bさん' AND 交通手段='バス' 4) 1)の結果の3件目をSELECTする SELECT COUNT(*) FROM テーブル WHERE 名前='Bさん' AND 交通手段='電車' なおレンタルサーバ上 (MySQL 5.0.77) で稼働させるため、 なるべく高速な SQL を希望いたします。

    • ベストアンサー
    • MySQL
  • SQL テーブル結合

    こんばんは SQLのselectで困っています。 以下の2つのテーブルから、 ID=2の人のID,名前,Birthday,2007年の合計給与を取得したい時、 どのようなSQLにすればよいのでしょうか>_< Empテーブル --------------------------------------- ID | Name |Birthday -----|---------|----------------------- 1  |Suzuki  |19491120 2  |Tanaka  |19551020 3  |Ito   |19500203 -----|---------|----------------------- 給与テーブル(上期下期で分かれている) --------------------------------------- ID |Year |Term |Salary -----|-------|------------|------------ 1 |2007 |FirstHalf |2200000 1 |2007 |SecondHalf |1950000 1 |2008 |FirstHalf |2000000 1 |2008 |SecondHalf |1900000 2 |2007 |FirstHalf |2000000 2 |2007 |SecondHalf |2000000 2 |2008 |FirstHalf |2100000 2 |2008 |SecondHalf |1800000 -----|-------|------------|---------- 色々試したのですが、いまいちわかりません。 アドバイスお願いします!