1

私のプロジェクトには MS Access 2003 データベースが含まれています。データベースのテーブルには、学生名という列が含まれています。1 つの列には n 個の学生の名前が含まれます。たとえば。John、Jim、Johny、Tom など。動的に追加されます。今私が欲しいのは、列内のすべての名前の完全なリストが欲しいということです。たとえばのように。列が

Student_name

John, Jim, Johny, Tom, Jack

次のように出力したい:

Student_name

John
Jim
Johny
Tom
Jack

クエリは MS Access をサポートする必要があります。私はhtmlファイルでデータを取得していて、そのhtmlファイルをMS Aacessデータベースに添付しました

4

1 に答える 1

0

申し訳ありませんが、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

終了機能
于 2013-12-29T12:03:36.403 に答える