Accessの更新クエリに関する質問です。

以下の様なテーブル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などでぐるぐる」ではなく、更新クエリでスパッと解決できると助かります。
(表組み記法が相変わらず良く判りません。見にくくて申し訳ありません。。)

回答の条件
  • 1人2回まで
  • 13歳以上
  • 登録:2010/09/09 23:34:49
  • 終了:2010/09/16 14:03:40

ベストアンサー

id:tak_tm No.3

tak_tm回答回数2ベストアンサー獲得回数12010/09/12 12:53:14

ポイント40pt

階層をレコード内容に合わせる場合だと、

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

id:oich

ご指摘の方法で解決できそうですね。2度目のご回答ありがとうございました。

もしかするとさらにエレガントな方法があるかもしれませんので、もうしばらく回答募集中にしておきます。

2010/09/12 13:47:59

その他の回答(2件)

id:ghfgbhdb No.1

ghfgbhdb回答回数38ベストアンサー獲得回数02010/09/09 23:43:45

こちらで解決できます。


http://sooda.jp/questions/

id:oich

解決できませんでした。

2010/09/10 01:40:07
id:tak_tm No.2

tak_tm回答回数2ベストアンサー獲得回数12010/09/11 01:17:59

ポイント40pt

こういうのでしょうか?

階層数が決まっていないと使えませんが。

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

id:oich

お教えいただいた方法で当面は解決しそうですが、やはり階層数が不定なので少し不安です。

もし可能なら階層数の上限が不明でも通用する方法があると助かります。

2010/09/11 19:13:50
id:tak_tm No.3

tak_tm回答回数2ベストアンサー獲得回数12010/09/12 12:53:14ここでベストアンサー

ポイント40pt

階層をレコード内容に合わせる場合だと、

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

id:oich

ご指摘の方法で解決できそうですね。2度目のご回答ありがとうございました。

もしかするとさらにエレガントな方法があるかもしれませんので、もうしばらく回答募集中にしておきます。

2010/09/12 13:47:59

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません