2016-12-18 13 views
0

私はお互いに関連する2つのテーブルを持っています。最初のテーブルには、後のテーブルに同じ属性の番号が1つ以上あります。 (1対多の関係があるため)、後者の表の行には基本的に(PK、FK、属性)の列が含まれています。最初の表の一部の行には属性がなく、後の表には記録されません。最初のテーブルのすべての結果をリストする2つのテーブルを結合する

最初のテーブルのすべての行を、後者のテーブルの属性の余分な列とともにリストしたいとします。内部結合またはwhere節を使用すると、属性のない結果はリストできません。しかし、私がしたいのは、最初のテーブルからすべての行をリストすることです。それには属性がない場合は、余分な列をnullにしたいのですが、複数の属性がある場合は、それらを連結したい単一列

私はここでコードを共有していないことを認識しています。私は抽象的な方法で質問しています。なぜなら、まずどのツールをどのように使うべきかを知る必要があるからです。 select文やISNULLなどのメソッドを使用してジョインとサブクエリを試しましたが、何をしているのかわからず、うまくいきませんでした。

PS:私はあなたが観察できるように、サイトには初めてです。したがって、これが質問をする適切な方法ではないと思う場合、フォーラムからこの質問を削除することを提案しても、私は質問はしません。

答えて

1
SELECT TableA.*, TableB.Attribute 
FROM TableA LEFT JOIN TableB ON TableA.PK = TableB.FK 

編集:私はちょうど元の質問をより完全に読んで、これがあなたの後ろのものではないことに気づいた。これにより、TableBに関連するデータがない場合に必要なNULL値が得られますが、TableBの関連する複数の値を特定のTableAレコードの1つの行に連結したい場合は、関数を記述する必要があります。新しいモジュールを作成し、ここに以下の関数を追加します。ここでは、PK列とFK列が長整数型で、属性値が文字列であると仮定しています。私はあなたがMS-Accessで働いていると仮定しています。

Public Function ListAttributes(lngPK As Long) As String 

    Dim rsAttributes As DAO.Recordset 
    Dim strResult as String 

    Set rsAttributes = CurrentDB.OpenRecordset("SELECT Attribute FROM TableB WHERE FK = " & lngPK) 
    Do While Not rsAttributes.EOF 
     strResult = strResult & ", " & rsAttributes!Attribute 
     rsAttributes.MoveNext 
    Loop 
    If strResult <> "" Then 
     strResult = Mid(strResult, 3) 
    End If 
    ListAttributes = strResult 
    Set rsAttributes = Nothing 

End Function 

あなたのクエリ、あなたは今、テーブルBには対応する行を持たないテーブルAの行に空の文字列の代わりにNULLを取得しますが、あなたは常にIIf機能を使用することができます

SELECT *, ListAttributes(PK) FROM TableA 

注なりました必要に応じてこれを修正するために電話してください。

+1

あなたが行っていることの説明を追加するといいですね。 – sds

+0

男性、これは優れています。私は自分自身に参加する左にしようとするだろうが、私はVBに精通していないので、機能は命綱です。あなたの助けに感謝します –

関連する問題