sql oraceに深く入り込んで再帰的に調べます。


☆データベースのすべてのテーブル名、テーブルのすべての列名を取得する   select name from syssobject where xtype='u   select name from sysscolumns where id=(select max)from syssobject where xtype=''u'and name='表名')☆再帰的検索データSql文の再帰的検索Sql Server 2005とOracleの2つのバージョンは以前Oracleを使っています。Sql Server 2005バージョンのSqlは次のように説明されています。例えば、テーブル、idとpIdフィールドがあり、idはメインキーで、pidはその上位ノード、テーブル構造とデータを表しています。CREATE TABLE[aa]( [id][int]NULL、 [pid][int]NULL、 [name)[nchal](10))GOINSERT INTO a aaaaaaaaaaaaVLES(1,0,'a')INSERT ININSERT INTOaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaVVUUUUUUUUUUUUUUUUUUUUUUUUUUES( 2(2))(2,BBBBB)INSERT INTO a a a VALES(7,3,g')INSERT INTO aa VALES(8,4,'h')GO--下のSqlは、1つのポイントを検索したすべてのサブノードwith my 1 as(select*from aa where id=1)です。 union all select aaa.from my 1,aa where my 1.id=aaa.pid)select*from my 1--結果は1という記録が含まれていますが、含まれたくないなら最後に加えてもいいです。下のSqlは8点を検索したすべての父の接合点with my 1 ase(sefrom=from)です。 union all select aa.*from my 1,aa where my 1.pid=aa.id)select*from my 1.--以下は再帰的に1の結点とすべてのサブ結点を削除する語句です。with my 1 as(select*from aa where id=1)   union all select aaaa.from my 1,aa where my 1.id=aaa.pid)delete from aaa where exists(select id from my 1 where=aa.id)OracleバージョンのSqlは以下の通りです。たとえば、テーブルのように、idとpidがあります。Sqlは次の通りです。--下のSqlは1つのポイントのすべてのサブノードを検索します。 SELECT*FROM aa  START WITH id=1 CONNET BY pid=PRIOR id--以下のSqlは8つの接合点を調べたすべての親の接合点です。 SELECT*FROM aa  START WITH id=8 CONNET BY PRIOR pid=idは今日他の人に面白いsqlを作ってあげました。再帰的に実現しました。具体的には下記の通りです。もし販売表があれば、CREATE TABLE[tb](    [qj][int]NULL、    -- 月に、このテストは1月から始まると仮定して、しかもデータは連続的な月で、中間は中断していません。    [je][int]NULL、    -- 今月の販売実績金額    [rwe][int]NULL、    -- 今月の販売任務額    [flad][float]NULL    -- 今月の金額は任務額より大きい場合のリターンポイントで、リターン額はje*fladです。ON[PRIMARY]は現在、毎月のリターン金額を計算することを要求しています。ルールは以下の通りです。1月の販売金額は任務額より大きいです。  リターン額=金額*リターンポイント2月の販売金額は任務額より大きいです。  リターン額=(金額-1月のリターン額)*リターンポイント3月の販売金額は任務額より大きいです。  戻り値=(金額-1,2月の戻り値)*リターンポイント以降は月ごとに分類され、売上高がタスク額より小さい場合は、戻り値が0の具体的なSqlは以下の通りです。

WITH my1 AS (
                SELECT *,
                       CASE
                            WHEN je > rwe THEN (je * fld)
                            ELSE 0
                       END fle,
                       CAST(0 AS FLOAT) tmp
                FROM   tb
                WHERE  qj = 1
                UNION ALL
                SELECT tb.*,
                       CASE
                            WHEN tb.je > tb.rwe THEN (tb.je - my1.fle -my1.tmp)
                                 * tb.fld
                            ELSE 0
                       END fle,
                       my1.fle + my1.tmp tmp --
                FROM   my1,
                       tb
                WHERE  tb.qj = my1.qj + 1
            )
SELECT *
FROM   my1
SQLserver 2008は、式を使って再帰的に照会します。text from treeview where parentid=450 union all--再帰結果集中の下位select t t t.id,t.parentid,t.text from treeview ast inner ject ast.parentid=c.id)select id,parentid下級、text from treeview、tect der----------------------------------------------------------------------rent parent parentittttxt panertext from treeview where id=450 union all--再帰結果集中の親項select t t.id,t.parentid,t.text from treeview as t inner ject as.id=c.parentid)select id,parentid,text from