2

以下をループに単純化することは可能ですか?

SELECT ID as ColHead, "Field1" AS RowHead, Field1 AS TheVal
FROM `master`
UNION
SELECT ID, "Field2",Field2
FROM `master`
UNION
SELECT ID, "Field3",Field3
FROM `master`
UNION
...
SELECT ID, "Field90",Field90
FROM `master`

90分野あります。これを手で書き始める前に、プロセスを簡素化する方法はありますか?

4

1 に答える 1

3

UNIONその大規模なクエリを作成する場合は、UNION ALL代わりに検討してください。

UNION ALL重複する行を含め、各ピースからすべての行を返します。SELECTjustを使用UNIONすると、db エンジンは個別の行のみを返します。ただし、個別の行を確保すると、エンジンにより大きな負荷がかかります。

UNION個別の行のみが必要な場合に使用します。UNION ALL重複行を受け入れることができる場合に使用します。またUNION ALL、そもそも候補行に重複を含めることができない場合にも使用します。

そのIDフィールドがmaster主キーである場合、または に別の一意制約 (インデックス) がIDある場合、候補行は既に一意になります。それがあなたの状況である場合はUNION ALL、db エンジンでその大きなクエリをより簡単にするために使用します。

実際、私はUNION(またはUNION ALL) 89を試みることに不安を感じていSELECTsます。私はこれほど巨大な SQL ステートメントを試みたことはありません。試してみたい場合は、別のアプローチを提供します。

SQL ステートメントを作成する VBA 関数を作成しました。からフィールド名を読み取り、TableDefそれらの名前をループしてSELECT各フィールド名の一部を追加します。

これは、Access 2007 で関数をテストしたイミディエイト ウィンドウ セッションです。私のmasterテーブルには 4 つのフィールドしか含まれていませんIDfld1; fld2; とfld3

? BuildUnionStatement
SELECT ID as ColHead, 'fld1' AS RowHead, [fld1] AS TheVal
FROM [master]
UNION ALL
SELECT ID as ColHead, 'fld2' AS RowHead, [fld2] AS TheVal
FROM [master]
UNION ALL
SELECT ID as ColHead, 'fld3' AS RowHead, [fld3] AS TheVal
FROM [master]

クエリを作成した後、クエリで何をするつもりなのかわかりません。ただし、SQL を作成する関数は柔軟性を提供します。関数の出力を使用して、レコードセットを開き、QueryDefフォームまたはレポートのレコード ソースなどとして保存することができます。

Public Function BuildUnionStatement() As String
    Const cstrTable As String = "master"
    Dim db As DAO.database
    Dim fld As DAO.Field
    Dim tdf As DAO.TableDef
    Dim strPattern As String
    Dim strSql As String

    'strPattern = vbCrLf & "UNION" & vbCrLf & 
    strPattern = vbCrLf & "UNION ALL" & vbCrLf & _
        "SELECT ID as ColHead, " & _
        "'FLDNAME' AS RowHead, " & _
        "[FLDNAME] AS TheVal" & vbCrLf & _
        "FROM [" & cstrTable & "]"

    Set db = CurrentDb
    Set tdf = db.TableDefs(cstrTable)
    For Each fld In tdf.Fields
        If fld.Name <> "ID" Then
            strSql = strSql & Replace(strPattern, _
                "FLDNAME", fld.Name)
        End If
    Next

    Set fld = Nothing
    Set tdf = Nothing
    Set db = Nothing

    'BuildUnionStatement = Mid(strSql, 10) ' UNION
    BuildUnionStatement = Mid(strSql, 14) ' UNION ALL
End Function

その関数をモジュールに保存した後、イミディエイト ウィンドウ ( Ctrl+ g) を開きます。関数を実行するには、これを入力して押しますEnter

? BuildUnionStatement

返されたテキストをコピーし、新しいクエリを作成して SQL ビューに切り替え、コピーしたテキストを貼り付けます。

イミディエイト ウィンドウからコピーするにはテキストが多すぎるため、新しいクエリを作成します。どのクエリも機能します。次に、関数の出力をクエリの SQL プロパティに割り当てます。イミディエイト ウィンドウでこれを行う ...

CurrentDb.QueryDefs("YourQueryNameHere").SQL = BuildUnionStatement
于 2013-04-26T15:06:11.430 に答える