序文 部門テーブルなどのデータベース内のツリー構造データの場合、部門のすべての従属部門または部門のすべての上位部門を知る必要がある場合があります。このとき、MySQLの再帰クエリを使用する必要があります。 現在、プロジェクトを Oracle から MySQL に移行しています。MySQL にはない Oracle 関数がいくつかあったため、関数をカスタマイズするか、変換のために関数を置き換える方法を見つける必要がありました。 Oracle 再帰クエリ Oracleが再帰クエリを実装している場合は、start with ... connect byを使用できます。 再帰クエリによる接続の基本的な構文は次のとおりです。
start with: どのノードがルートノードであるかを示します。1=1 と記述しても制限はありません。ID 123 のノードをルートノードとして使用するには、start with id =123 と記述します。 connect by: connect by は必須です。start with は場合によっては省略できます。または、制限なく 1=1 で始まります。 Prior: prior キーワードは等号の前または後に置くことができ、意味が異なります。たとえば、prior id = pid は、pid がこのレコードのルート ノードであることを意味します。 詳細については、私が以前に書いた Oracle ブログを参照してください: https://www.jb51.net/article/156306.htm Oracle 実装 <select id="listUnitInfo" resultType="com.admin.system.unit.model.UnitModel" databaseId="oracle"> 異なるu.unit_codeを選択し、 u.ユニット名、 u.ユニット_tel、 u.para_unit_code lzcity_approve_unit_info から u 1から始める = 1 <if test="unitCode != null かつ unitCode !=''"> u.unit_code = #{unitCode} です </if> <if test="unitName!=null かつ unitName!=''"> u.unit_name は '%'|| #{unitName} ||'%' のようになります </if> 事前の u.unit_code = u.para_unit_code で接続する および u.unit_code <>u.para_unit_code </選択> MySQL 再帰クエリ 以下では主にMySQLの実装を紹介します。MySQLは同様の機能を提供していないため、カスタム関数を通じてのみ実装できます。インターネット上にはそのような資料がたくさんありますが、どれがオリジナルなのかわかりません。このブログはよく書かれています、https://www.jb51.net/database/201209/152513.html。以下では、著者が提供した方法を使用して、独自の実装も行います。共有してくれた著者に感謝します。 ここでは、著者が提供したカスタム関数と、Find_in_set関数 <select id="listUnitInfo" resultType="com.admin.system.unit.model.UnitModel" databaseId="mysql"> 異なるu.unit_codeを選択し、 u.ユニット名、 u.ユニット_tel、 u.para_unit_code t_unit_info から u <どこ> <if test="unitCode != null かつ unitCode !=''"> そして find_in_set(u.unit_code,getunitChildList(#{unitCode})) </if> <if test="unitName!=null かつ unitName!=''"> そして u.unit_name は concat('%', #{unitName} ,'%') のように記述します。 </if> </どこ> </選択> getUnitChildList カスタム関数 区切り文字 $$ `gd_base`$$ を使用します 存在する場合は関数を削除します `getUnitChildList`$$ CREATE DEFINER=`root`@`%` FUNCTION `getUnitChildList`(rootId INT) RETURNS VARCHAR(1000) CHARSET utf8 始める sChildList VARCHAR(1000) を宣言します。 sChildTemp VARCHAR(1000) を宣言します。 SET sChildTemp = CAST(rootId AS CHAR); sChildTempがNULLでない場合に実行 sChildListがNULLでない場合 SET sChildList = CONCAT(sChildList,',',sChildTemp); それ以外 sChildList を CONCAT(sChildTemp) に設定します。 終了の場合; LZCITY_APPROVE_UNIT_INFO から GROUP_CONCAT(unit_code) INTO sChildTemp を選択し、FIND_IN_SET(para_unit_code,sChildTemp)>0 を指定します。 終了しながら; sChildList を返します。 終わり$$ 区切り文字 ; 要約する 上記はこの記事の全内容です。この記事の内容が皆さんの勉強や仕事に一定の参考学習価値を持つことを願っています。ご質問があれば、メッセージを残してコミュニケーションしてください。123WORDPRESS.COM を応援していただきありがとうございます。 以下もご興味があるかもしれません:
|
<<: CentOS 8 インストール図 (超詳細なチュートリアル)
この記事では、MySQL の sql_mode モードについて例を挙げて説明します。ご参考までに、詳...
余計なことは言わないで、コードだけ見てみましょう〜 -- テーブル内のフィールドコメントを表示および...
目次ステップ1: フレームワークを構築するステップ2 構築されたPromiseフレームワークに入力す...
序文1. この記事ではMySQL 8.0バージョンを使用していますバージョン5.0と比較すると、パッ...
1. オーバーフロー:非表示 オーバーフロー非表示要素に overflow:hidden が設定さ...
目次1. 非同期2. 待つ: 3. 包括的なアプリケーション1. 非同期async 、非同期コードが...
インストール プロセスは、コンパイル手順を除いて、基本的にソース バージョンと同じです。この記事では...
ファイル名が少ないファイルを表示ファイル名を少なく | grep -n コンテンツを検索内容に応じて...
実際、XHTML 1.0 は、Transitional DOCTYPE と Strict DOCTY...
1. クエリを最適化するには、テーブル全体のスキャンを避けてください。まず、where と orde...
0. はじめにibdata1 ファイルとは何ですか? ibdata1 は、innodb システム テ...
CSSは複数のクラスにマッチする次の HTML タグ li、クラスはオープン スタイルです。私の要件...
Linux システムには、ファイル共有を解決するために使用できるリンク ファイルと呼ばれる種類のファ...
目次概要環境の準備プロジェクトのパフォーマンスに影響を与える要因遅延読み込みとは何ですか?プロジェク...
チュートリアルシリーズMySQL シリーズ: MySQL リレーショナル データベースの基本概念My...