以下の様なテーブルAがあったとして、
|*ID1|*ID2|*文字列|
|1|1|赤|
|1|2|青|
|1|3|白|
|1|4|黒|
|2|1|橙|
|2|2|灰|
|3|1|黄|
|:|:|:|
テーブルBを、ID2順に文字列を連結して、
|*ID1|*文字列|
|1|赤青白黒|
|2|橙灰|
|3|黄|
|:|:|
等としたいのです。
必ずしもID2順とならずに文字を連結するだけなら何とかなったのですが、
連結の順番を制御する方法がわかりませんでした。
「ADOなどでぐるぐる」ではなく、更新クエリでスパッと解決できると助かります。
(表組み記法が相変わらず良く判りません。見にくくて申し訳ありません。。)
階層をレコード内容に合わせる場合だと、
VBAでSQLを書き換えるのが良いかと思います
以下のコードで、"クエリA" という名前のクエリの内容を書き換えられます
フォームのボタンクリックなどから呼び出す形を想定しています
※ 予め "クエリA" を作成しておかないとエラーになります
Sub editSQL()
Dim sql As String, qry As QueryDef, tName As String, i As Integer, n As Integer
'テーブルA内のID2最大値
n = DMax("ID2", "テーブルA")
'各初期値
tName = "t1"
sql = "SELECT * FROM テーブルA WHERE ID2 = 1"
'ループしてSQLを作成
For i = 2 To n
sql = "SELECT " & tName & ".ID1, " & tName & ".文字列 " & Chr(38) & " t" & i & ".文字列 AS 文字列 " & vbCrLf _
& "FROM (" & sql & ") AS " & tName & " " & vbCrLf _
& "LEFT OUTER JOIN (SELECT * FROM テーブルA WHERE ID2 = " & i & ") AS t" & i & " ON " & tName & ".ID1 = t" & i & ".ID1 "
tName = tName & i
Next
Set qry = CurrentDb.QueryDefs("クエリA")
qry.sql = sql
Set qry = Nothing
DoCmd.OpenQuery "クエリA"
End Sub
こういうのでしょうか?
階層数が決まっていないと使えませんが。
SELECT t123.ID1, t123.文字列 & t4.文字列 AS 文字列
FROM (SELECT t12.ID1, t12.文字列 & t3.文字列 AS 文字列
FROM (SELECT t1.ID1, t1.文字列 & t2.文字列 AS 文字列
FROM (SELECT * FROM テーブルA WHERE ID2 = 1) AS t1
LEFT OUTER JOIN (SELECT * FROM テーブルA WHERE ID2 = 2) AS t2 ON t1.ID1 = t2.ID1) AS t12
LEFT OUTER JOIN (SELECT * FROM テーブルA WHERE ID2 = 3) AS t3 ON t12.ID1 = t3.ID1) AS t123
LEFT OUTER JOIN (SELECT * FROM テーブルA WHERE ID2 = 4) AS t4 ON t123.ID1 = t4.ID1
ORDER BY t1.ID1
お教えいただいた方法で当面は解決しそうですが、やはり階層数が不定なので少し不安です。
もし可能なら階層数の上限が不明でも通用する方法があると助かります。
階層をレコード内容に合わせる場合だと、
VBAでSQLを書き換えるのが良いかと思います
以下のコードで、"クエリA" という名前のクエリの内容を書き換えられます
フォームのボタンクリックなどから呼び出す形を想定しています
※ 予め "クエリA" を作成しておかないとエラーになります
Sub editSQL()
Dim sql As String, qry As QueryDef, tName As String, i As Integer, n As Integer
'テーブルA内のID2最大値
n = DMax("ID2", "テーブルA")
'各初期値
tName = "t1"
sql = "SELECT * FROM テーブルA WHERE ID2 = 1"
'ループしてSQLを作成
For i = 2 To n
sql = "SELECT " & tName & ".ID1, " & tName & ".文字列 " & Chr(38) & " t" & i & ".文字列 AS 文字列 " & vbCrLf _
& "FROM (" & sql & ") AS " & tName & " " & vbCrLf _
& "LEFT OUTER JOIN (SELECT * FROM テーブルA WHERE ID2 = " & i & ") AS t" & i & " ON " & tName & ".ID1 = t" & i & ".ID1 "
tName = tName & i
Next
Set qry = CurrentDb.QueryDefs("クエリA")
qry.sql = sql
Set qry = Nothing
DoCmd.OpenQuery "クエリA"
End Sub
ご指摘の方法で解決できそうですね。2度目のご回答ありがとうございました。
もしかするとさらにエレガントな方法があるかもしれませんので、もうしばらく回答募集中にしておきます。
ご指摘の方法で解決できそうですね。2度目のご回答ありがとうございました。
もしかするとさらにエレガントな方法があるかもしれませんので、もうしばらく回答募集中にしておきます。