1

アクセスデータベース

table contacts
--------------
id
surname
name


table relations
---------------
contact_id
relation_id

contact_idとrelation_idはどちらも、テーブルの連絡先のIDを参照する外部キーです。

現在の連絡先のリレーションが存在する場合は、クエリを実行して、連絡先の名前/名前とリレーションの名前/名前の両方を取得したいと思います。存在しない場合は、連絡先の名前/名前と、リレーションのフィールドの空白の値を取得します。

このすべてを1つのクエリで

編集:

左結合を使用しました。VB.NETを使用してクエリを実行しています。

Dim myOleDbDataReader As OleDbDataReader = _
    New OleDbCommand( _
    "SELECT c.id           AS contact_id " & _
    "     , c.surname      AS contact_surname " & _
    "     , c.name         AS contact_name " & _
    "     , c2.id          AS related_id " & _
    "     , c2.surname     AS related_surname " & _
    "     , c2.name        AS related_name " & _
    "FROM ((contacts c " & _
    "LEFT JOIN relations r " & _
    "ON c.id = r.contact_id) " & _
    "INNER JOIN contacts c2 " & _
    "ON c2.id = r.relation_id)" _
    , connection).ExecuteReader()

OleDbExceptionが発生します:Join式はサポートされていません

彼らは別の投稿で次のように述べています。「FROM句でLEFT/RIGHT / INNER JOINSを使用する場合、Accessではwhere句で従来の結合を使用できません。おそらくより高価なソフトウェアを購入することを意図しています。」-(結合式はMS Accessでサポートされていませんか?

正確にはそうではありません。私が試したいくつかの例から、次のような結論に達しました。

Accessでは、外部結合(LEFT / RIGHT)を1つ以上の内部結合と一緒に使用することはできません。ジョン・カーマックの名前で私は何ができますか?個別のselectクエリは避けたいと思います。助けてください...

4

1 に答える 1

3
SELECT c.id       AS contact_id
     , c.surname  AS contact_surname
     , c.name     AS contact_name
     , c2.id      AS related_id
     , c2.surname AS related_surname
     , c2.name    AS related_name
FROM contacts c
  LEFT JOIN relations r
    ON c.id = r.contact_id
  JOIN contacts c2
    ON r.relation_id = c2.id

上記はMS-Accessでは機能しません。

これは少し異なります(2つの左結合)が機能します

SELECT c.id       AS contact_id
     , c.surname  AS contact_surname
     , c.name     AS contact_name
     , c2.id      AS related_id
     , c2.surname AS related_surname
     , c2.name    AS related_name
FROM contacts c
  LEFT JOIN
    ( relations r
      LEFT  JOIN contacts AS c2
        ON r.relation_id = c2.id
    )  
    ON c.id = r.contact_id

2番目LEFT JOINの場合でも、2番目のLEFT JOINには外部キー関係(多く-> 1からの方向)が含まれるため、同じ結果セットが得られます。

左の結合と内側の結合を使用するには、次を使用できます。

SELECT c.id       AS contact_id
     , c.surname  AS contact_surname
     , c.name     AS contact_name
     , g.id       AS related_id
     , g.surname  AS related_surname
     , g.name     AS related_name
FROM contacts c
  LEFT JOIN
    ( SELECT r.contact_id
           , c2.id      
           , c2.surname
           , c2.name 
      FROM relations r
        INNER JOIN contacts AS c2
          ON r.relation_id = c2.id
    )  AS g
    ON c.id = g.contact_id
于 2011-04-12T11:59:52.813 に答える