• ベストアンサー

Access 結合プロパティについて

Access2010ですが、クエリの結合プロパティについて教えて下さい。 【テーブルA】 1 A1 2 A2 3 A3 【テーブルB】 2 B2 3 B3 4 B4 と言うテーブルから 【結合クエリ】 1 A1 2 A2 B2 3 A3 B3 4 B4 を作りたいです。 ところが、結合プロパティでは、 ・テーブルAのレコードを全部 ・テーブルBのレコードを全部 と言うのは選べるのですが、 両方のテーブルいずれかにあればデータを持ってくる と言う設定が分かりません。 すみません。どなたか教えて下さい。 よろしくお願いいたします。

質問者が選んだベストアンサー

  • ベストアンサー
  • piroin654
  • ベストアンサー率75% (692/917)
回答No.5

すみません。訂正です。 No2の最後のあたりで、 >次に、以下のクエリを作成します。 >SELECT クエリ12.数値, funcStr([数値]) AS 名前の結合 >FROM クエリ12 >GROUP BY クエリ12.数値, funcStr([数値]); としていますが、クエリ名がこちらで確認したクエリ名のままに なっていたので、SQL文を SELECT Q結合.数値, funcStr([数値]) AS 名前の結合 FROM Q結合 GROUP BY Q結合.数値, funcStr([数値]); のように変更してください。 失礼しました。 なお、Q結合のなかで使用している サブクエリとEXISTSについては、 AccessのヘルプなりWEBで検索してみてください。 簡単にいうと、集合での直積にあたります。

その他の回答 (4)

  • piroin654
  • ベストアンサー率75% (692/917)
回答No.4

No2です。説明が少し抜けていたので補足しておきます。 「Q結合」を作成するところでの説明です。 「Q結合」を開くと、 数値  名前 1    A1 2    A2 2    B2 3    A3 3    B3 4    B4 のような結果が得られます。これだけで必要なデータは出ているのですが、 質問のように 1 A1 2 A2 B2 3 A3 B3 4 B4 のような表示をするためには自前の関数を使って、 整形をする必要があります。

key51
質問者

お礼

回答ありがとうございました。 プロパティの設定だけでは無理そうですね。 こう言うパターンもありそうなのに、 意外というか、用意されていないものなのですね。 ちょっと試してみます! ありがとうございました。

回答No.3

追記。 要は「Aにしかないもの」「両方にあるもの」「Bにしかないもの」の3種類を別々のクエリで作って、最後に「3つをUNIONで連結」しているのです。 「Aにしかないもの」+「両方にあるもの」+「Bにしかないもの」=「両方のテーブルいずれかにある」ですからね。

  • piroin654
  • ベストアンサー率75% (692/917)
回答No.2

単純にはいかないと思いますが。 それぞれのテーブルのフィールドの名前を 数値 (数値型) 名前 (テキスト型) とし、 【テーブルA】 数値  名前 1   A1 2   A2 3   A3 【テーブルB】 数値  名前 2   B2 3   B3 4   B4 のようにします。これから、以下のユニオンクエリを作ります。 名前を「Q結合」とします。 SELECT テーブルA.数値, テーブルA.名前 FROM テーブルA UNION SELECT テーブルA.数値, テーブルA.名前 FROM テーブルA WHERE EXISTS (SELECT テーブルB.数値, テーブルB.名前 FROM テーブルB WHERE テーブルB.数値=テーブルA.数値); UNION SELECT テーブルB.数値, テーブルB.名前 FROM テーブルB; 次に、標準モジュールに以下のコードを貼り付け保存します。 なお、DAOをつかっているのでコード表の ツール→参照設定で Microsoft DAO xx Object Library にチェックを入れておいてください。 xxは3.6のような数字です。 Function funcStr(ByVal mystr As String) As String   Dim db As DAO.Database   Dim rs As DAO.Recordset   Dim strBuf As String   Set db = CurrentDb   Set rs = db.OpenRecordset("Q結合")   If rs.RecordCount > 0 Then     rs.MoveFirst     Do Until rs.EOF       If mystr = rs!数値 Then         strBuf = strBuf & rs!名前 & " "       End If       rs.MoveNext     Loop     If Right(strBuf, 1) = " " Then       strBuf = Left(strBuf, Len(strBuf) - 1)     End If     funcStr = strBuf   End If   rs.Close: Set rs = Nothing   db.Close: Set db = Nothing End Function なお、上記は http://okwave.jp/qa/q8059912.html でつかったものと同じで、一部が変更されているだけです。 次に、以下のクエリを作成します。 SELECT クエリ12.数値, funcStr([数値]) AS 名前の結合 FROM クエリ12 GROUP BY クエリ12.数値, funcStr([数値]); これで、 1 A1 2 A2 B2 3 A3 B3 4 B4 のような結果が表示されると思いますが。

回答No.1

クエリがたくさん必要です。 【テーブルA】   データ 1 A1 2 A2 3 A3 から 【クエリA1】   データ 式1 1 A1   1 2 A2   2 3 A3   3 を作るクエリ、つまり「2文字目の数字部分を式1として取り出すクエリ」が要ります。 同様に 【テーブルB】   データ 1 B1 2 B2 3 B3 から 【クエリB1】   データ 式1 1 B2   2 2 B3   3 3 B4   4 を作るクエリも要ります。 【クエリA1】と【クエリB2】を「式1」で結合し、「両方のテーブルの結合フィールドが同じ行だけを含める」にした【クエリAB】を作ります。 結果は 【クエリAB】   クエリA1.データ クエリB1.データ 1 A2         B2 2 A3         B3 になります。 次に【クエリA1】と【クエリB2】を「式1」で結合し、「クエリA1の全レコードと…」にして、「クエリB1のデータの抽出条件」に「Is Null」を指定した【クエリA2】を作ります。 結果は 【クエリA2】   クエリA1.データ クエリB1.データ 1 A1         (NULL) になります。 次に【クエリA1】と【クエリB2】を「式1」で結合し、「クエリB1の全レコードと…」にして、「クエリA1のデータの抽出条件」に「Is Null」を指定した【クエリB2】を作ります。 結果は 【クエリB2】   クエリA1.データ クエリB1.データ 1 (NULL)       B4 になります。 最後に【クエリA2】と【クエリAB】と【クエリB2】をUNIONで結合した【結果クエリ】を作ります。 UNION結合は、GUIデザインモードでは作れないので、編集モードを「SQL文編集モード」にして、以下のSQL文を打ち込んで作ります。 SELECT クエリA2.* FROM クエリA2 union SELECT クエリAB.* FROM クエリAB union SELECT クエリB2.* FROM クエリB2; 結果は 【結果クエリ】   クエリA1.データ クエリB1.データ 1 (NULL)       B4 2 A1         (NULL) 3 A2         B2 4 A3         B3 になります。

key51
質問者

お礼

回答ありがとうございました。 思った以上に難しくて(^_^;) びっくりしています。 意外にプロパティをいじるだけとかで 出来る様な無いようではなさそうですね。 ちょっと試してみます! ありがとうございました。

関連するQ&A