SQL - выберите из нескольких таблиц без результатов в одной из них - PullRequest
0 голосов
/ 25 мая 2018

Я думаю, что на этот вопрос можно было ответить раньше, но я не могу его найти: все результаты, которые я нашел, не являются решением этой проблемы ...

Давайте предположим, что в моей базе данных есть следующеетаблицы и отношения (и я не могу их изменить):

  • Объекты: пользователь, рабочая группа и очередь
  • Один пользователь может содержаться во многих рабочих группах, одна рабочая группа может иметь много пользователей.
  • Одна рабочая группа может иметь много очередей, одна очередь может принадлежать многим рабочим группам.
  • Есть две таблицы, устанавливающие эти отношения «многие ко многим»: m2m_user_wg, m2m_wg_queue

У меня есть такой запрос:

SELECT U.LOGIN, WG.WORKGROUP, Q.QUEUE
FROM USER U, M2M_USER_WG MUW, WORKGROUP W, M2M_WG_QUEUE MWQ, QUEUE Q
WHERE U.ID = MUW.WORKGROUP2USER
AND W.ID = MUW.USER2WORKGROUP
AND W.ID = MWQ.QUEUE2WORKGROUP
AND Q.ID = MWQ.WORKGROUP2QUEUE
AND U.LOGIN = 'johndoe'

Этот запрос работает нормально, когда все сущности имеют существующие значения, но давайте предположим, что у пользователя есть только одна рабочая группа, а у этой рабочей группы нет очереди.Идентификатор рабочей группы не будет существовать в таблице M2M_WG_QUEUE (MWQ), поэтому запрос не будет отображать результаты.

Я хочу видеть пользователя и его рабочие группы, даже если некоторые из них не имеюточереди.Примерно так:

USER      WORKGROUP    QUEUE
johndoe   WG3          Q7
johndoe   WG3          Q8
johndoe   WG4          Q7
johndoe   WG9

В приведенном выше примере результат должен выглядеть примерно так:

USER      WORKGROUP    QUEUE
johndoe   WG6

Как я могу это сделать?Я думаю, что это может быть сделано с помощью соединения или (+), но я пробовал это несколькими способами, и ни один из них не сработал ...

1 Ответ

0 голосов
/ 25 мая 2018

Никогда не используйте запятые в предложении FROM. Всегда используйте правильный, явный, стандартный JOIN синтаксис.Pro

Ваша проблема в том, что вам нужен LEFT JOIN, предположительно:

SELECT U.LOGIN, WG.WORKGROUP, Q.QUEUE
FROM USER U LEFT JOIN
     M2M_USER_WG MUW
     ON U.ID = MUW.WORKGROUP2USER LEFT JOIN
     WORKGROUP W
     ON W.ID = MUW.USER2WORKGROUP LEFT JOIN
     M2M_WG_QUEUE MWQ
     ON W.ID = MWQ.QUEUE2WORKGROUP LEFT JOIN
     QUEUE Q
     ON Q.ID = MWQ.WORKGROUP2QUEUE
WHERE U.LOGIN = 'johndoe';
...