UNION
その大規模なクエリを作成する場合は、UNION ALL
代わりに検討してください。
UNION ALL
重複する行を含め、各ピースからすべての行を返します。SELECT
justを使用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 つのフィールドしか含まれていませんID
。fld1
; 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