前提
次のようなテーブルがあります
NO FLD1 FLD2 Group
1 A B
2 B C
3 C D
4 C E
5 E F
6 F G
7 G H
8 I J
9 I K
10 L M
(FLD1,FLD2)のセットはユニークで
FLD1<FLD2となるように並べて
行としても昇順に格納されています。
AとBは同一グループ
BとCは同一グループ
CとDは同一グループ
という意味で、演繹法で
A,B,C,D,E,F,G,Hは一つのグループ
I,J,Kは同一グループです。
実現したいこと
次のようにグループ分けしたときの
Noの最小値をGroupに
書き込みしたいと思います。
NO FLD1 FLD2 Group
1 A B 1
2 B C 1
3 C D 1
4 C E 1
5 E F 1
6 F G 1
7 G H 1
8 I J 8
9 I K 8
10 L M 10
発生している問題・エラーメッセージ
お試しでACCESS VBAでテストデータ10件を
順次処理をすると出来ましたが、
本番はPostgreSQLで
現在約4万件、日々データが増えているので
PostgreSQLのSQL文で実行したいです。
自己結合クエリとか再帰クエリで
書けるのかな?と思うのですが
わかりません。
該当のソースコード
ACCESS VBA
ソースコード
Option Compare Database Sub 順次処理() 'ADOを使うための変数宣言 Dim cn As New ADODB.Connection Dim rs As New ADODB.Recordset Dim int_min_Group As Integer 'SQL文を格納するための変数宣言 Dim strSQL As String Dim strFLD As String DoCmd.SetWarnings False 'GroupフィールドNOセット strSQL = "UPDATE TEST SET TEST.Group = TEST.NO" DoCmd.RunSQL strSQL strSQL = "SELECT TEST.NO,TEST.FLD1,TEST.FLD2 FROM TEST ORDER BY TEST.NO" 'カレントデータベースに接続する。 Set cn = CurrentProject.Connection 'SQL文を開く rs.Open strSQL, cn '先頭レコードに移動 rs.MoveFirst Do Until rs.EOF = True 'イミディエイトウィンドウに値を表示 strFLD = " (""" & rs.Fields(1) & """,""" & rs.Fields(2) & """)" strSQL = "(TEST.FLD1 in" & strFLD & " OR TEST.FLD2 in" & strFLD & ") AND NO <= " & rs.Fields(0) 'グループ番号の最小値を求める int_min_Group = DMin("Group", "TEST", strSQL) 'グループ番号を最小値で更新 strSQL = "UPDATE TEST SET TEST.Group = " & int_min_Group & " WHERE TEST.NO = " & rs.Fields(0) DoCmd.RunSQL strSQL '次のレコードに移動する。 rs.MoveNext Loop 'レコードセットを閉じる。 rs.Close 'データベース接続を閉じる。 cn.Close Set cn = Nothing DoCmd.SetWarnings True End Sub
試したこと
WITH RECURSIVEの親子構造の扱いを見てみましたが
それとはちょっと違うような―
SQLで実現できるでしょうか
どうぞよろしくお願いいたします。<(_ _)>
回答1件
あなたの回答
tips
プレビュー