質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
SQL Server

SQL Serverはマイクロソフトのリレーショナルデータベース管理システムです。データマイニングや多次元解析など、ビジネスインテリジェンスのための機能が備わっています。

Oracle

Oracleは、米オラクルが取り扱うリレーショナルデータベース管理システムです。メインフレームからPCまで、多様なプラットフォームに対応しています。

PostgreSQL

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

Q&A

解決済

1回答

5595閲覧

再帰SQLの上限回数指定について

ry188472

総合スコア74

SQL Server

SQL Serverはマイクロソフトのリレーショナルデータベース管理システムです。データマイニングや多次元解析など、ビジネスインテリジェンスのための機能が備わっています。

Oracle

Oracleは、米オラクルが取り扱うリレーショナルデータベース管理システムです。メインフレームからPCまで、多様なプラットフォームに対応しています。

PostgreSQL

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

0グッド

0クリップ

投稿2018/07/27 00:50

前提・実現したいこと

with句を使った再帰SQLを書いています。
SQLServerで動作確認したところ、100件を超える件数取得するようにSQL実行するとエラーになってしまいました。
取得されるはずの件数はあらかじめわかっているので、MAXRECURSION(件数)で問題なく動作させることができました。

さて、SQLServerのMAXRECURSIONと同様に、SQLに再帰回数の上限を指定するような機能はOracle, PostgreSQLにありますでしょうか?
簡単に調べたら見つからなかったので、ご存知の方はご教授ください。

補足情報(FW/ツールのバージョンなど)

Oracle -> 11gR2(11.2.0.4)
PostgreSQL -> 9.6.3

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

再帰が無限ループに陥らないようにするには、階層の深さについて制限を設けるのが有用です。

oracleの場合はレベル擬似列が使えます。

postgresの場合は同様のものを模倣する必要があります。
例えば、階層の関係(親子)を示す項目を(key,pkey)とし、10階層までの制限を設けるとすると

SQL

1WITH RECURSIVE r AS ( 2 SELECT *, 1 AS level 3 FROM test 4 WHERE pkey=0 5 UNION ALL 6 SELECT s.*, r.level + 1 7 FROM r inner join test s on s.pkey=r.key 8 WHERE r.level < 10 9) 10SELECT * FROM r

投稿2018/07/27 02:31

編集2018/07/27 05:03
sazi

総合スコア25195

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ry188472

2018/07/30 09:38

大変参考になりました。 ご回答ありがとうございました!!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問