申し訳ありませんが、MS Access はCTEのように再帰モードでクエリを実行する機能を提供していません。VBA マクロを使用して学生のコレクションを処理し、カンマ区切りの値をレコードのセットに分割することができます;)
フィールドを持つ表Studentがあるとします。
- ID (数値 - 整数)、
- 学生 (文字列 - 文字)
サンプルデータ:
ID学生
1 ジョン、ジム、ジョニー、トム、ジャック
2 ポーラ、ロバート、ティム、ドロシー
5 フランク、ラモーナ、ジョルジオ、テレサ、バーバラ
19 イザベル、イブ、エヴェリーナ、タディット
マクロの結果を格納する別のテーブルを作成する必要があります。
テーブル CTE1 の作成
(
ID INT、
OrigValue CHAR(255),
SingleValue CHAR(255),
剰余 CHAR(255)
);
マクロを追加するには、次の手順を実行してください。
- Visual Basic コード ペインに移動
- 新しいモジュールを挿入
- 以下のコードをコピーして、以前に追加したモジュールに貼り付けます
- マウス カーソルを **ModifyMyData** プロシージャに移動するには、本体内をクリックします。
- コードを実行 (F5)
オプション比較データベース
オプション明示
'Microsoft ActiveX Data Object 2.8 Library への参照が必要
Sub ModifyMyData()
Dim sSQL を文字列として
Dim rst As ADODB.Recordset
バリアントとしての薄暗い vArray
Dim i As Integer
'CTE テーブルをクリア
sSQL = "削除 * CTE から;"
CurrentDb.Execute sSQL
'最初のクエリ
sSQL = "CTE に挿入 (ID、OrigValue、SingleValue、剰余)" & vbCr & _
"SELECT ID, 学生 AS OrigValue, TRIM(LEFT(学生, InStr(1,学生,',')-1)) AS SingleValue, " & _
"TRIM(RIGHT(Students,LEN(Students)-InStr(1,Students,','))) AS剰余" & vbCr & _
「学生から;」
CurrentDb.Execute sSQL
sSQL = "SELECT ID、OrigValue、SingleValue、余り" & vbCr & _
「CTEから」
最初に設定 = 新しい ADODB.Recordset
rst.Open sSQL、CurrentProject.Connection、adOpenStatic
最初に
'最初のオブジェクトを埋める
.MoveLast
.MoveFirst
'プロセス
Do While Not rst.EOF
'剰余を配列に分割
vArray = Split(.Fields("Remainder"), ",")
'すべての値を追加
For i = LBound(vArray) から UBound(vArray)
sSQL = "CTE に挿入 (ID、OrigValue、SingleValue、剰余)" & vbCr & _
"VALUES(" & .Fields("ID") & ", '" & .Fields("OrigValue") & "','" & vArray(i) & "','" & GetReminder(vArray, i + 1 ) & "');"
CurrentDb.Execute sSQL
次
.MoveNext
ループ
。近い
で終わる
rst = 何も設定しない
MsgBox 「準備完了!」
DoCmd.OpenTable "CTE"
サブ終了
Function GetRemainder(vList As Variant, startpos As Integer) As String
Dim i は整数、sTmp は文字列
For i = startpos To UBound(vList)
sTmp = sTmp & vList(i) & ","
次
Len(sTmp) > 0 の場合、sTmp = Left(sTmp, Len(sTmp) - 1)
GetRemainder = sTmp
終了機能