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