- ベストアンサー
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のレコードを全部 と言うのは選べるのですが、 両方のテーブルいずれかにあればデータを持ってくる と言う設定が分かりません。 すみません。どなたか教えて下さい。 よろしくお願いいたします。
- みんなの回答 (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)
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 のような表示をするためには自前の関数を使って、 整形をする必要があります。
- chie65536(@chie65535)
- ベストアンサー率44% (8740/19838)
追記。 要は「Aにしかないもの」「両方にあるもの」「Bにしかないもの」の3種類を別々のクエリで作って、最後に「3つをUNIONで連結」しているのです。 「Aにしかないもの」+「両方にあるもの」+「Bにしかないもの」=「両方のテーブルいずれかにある」ですからね。
- piroin654
- ベストアンサー率75% (692/917)
単純にはいかないと思いますが。 それぞれのテーブルのフィールドの名前を 数値 (数値型) 名前 (テキスト型) とし、 【テーブル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 のような結果が表示されると思いますが。
- chie65536(@chie65535)
- ベストアンサー率44% (8740/19838)
クエリがたくさん必要です。 【テーブル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 になります。
お礼
回答ありがとうございました。 思った以上に難しくて(^_^;) びっくりしています。 意外にプロパティをいじるだけとかで 出来る様な無いようではなさそうですね。 ちょっと試してみます! ありがとうございました。
お礼
回答ありがとうございました。 プロパティの設定だけでは無理そうですね。 こう言うパターンもありそうなのに、 意外というか、用意されていないものなのですね。 ちょっと試してみます! ありがとうございました。