Показать результаты объединенных таблиц, даже если некоторые значения не совпадают - PullRequest
1 голос
/ 12 апреля 2011

Доступ к базе данных

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


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

И contact_id, иrence_id являются внешними ключами, на которые ссылается идентификатор таблицы контактов

Я хочу выполнить запрос, чтобы получить как фамилию / имя контакта, так и фамилию / имя отношения , если существует отношение для текущего контакта . Если он не существует, я хочу получить фамилию / имя контакта и пустые значения для полей отношения.

Все это в одном запросе

EDIT:

Я использовал левое соединение. Я выполняю запрос с использованием 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: выражение соединения не поддерживается.

В другом посте говорится, что: «Доступ не позволит вам использовать обычные объединения в предложении where, когда вы используете LEFT / RIGHT / INNER JOINS в предложении FROM. Вероятно, это намеренно заставить вас покупать более дорогое программное обеспечение» - ( Выражение соединения не поддерживается MS Access? )

Это не совсем так. Из некоторых примеров, которые я попробовал, я пришел к выводу, что:

Доступ не позволит использовать внешние соединения (ВЛЕВО / ВПРАВО) вместе с одним или несколькими ВНУТРЕННИМИ СОЕДИНЕНИЯМИ . Что на имя Джона Кармака я могу сделать? Я хотел бы избежать отдельных запросов выбора. Пожалуйста, помогите ...

1 Ответ

3 голосов
/ 12 апреля 2011
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.

Это немного отличается (два соединения слева), но работает :

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

Несмотря на второй LEFT JOIN, он даст тот же набор результатов, так как второе LEFT JOIN включает отношение внешнего ключа (в направлении от многих -> один).

Чтобы иметьСЛЕДУЮЩЕЕ СОЕДИНЕНИЕ С ВНУТРЕННИМ СОЕДИНЕНИЕМ, которое вы можете использовать:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...