SQL - проблема с соединением и не совпадающей строкой - PullRequest
0 голосов
/ 18 марта 2020

Я столкнулся с проблемой, пытаясь объединить 4 таблицы:

Разговор:

+-----+---------+------------+
| id: | start:  |    end:    |
+-----+---------+------------+
| a   |  3      |    87      |
| e   |  <null> |   4        |
| h   |  4      |    67      |
| l   |  5      |    6       |
| o   |  <null> |  <null>    |
+-----+---------+------------+

Телефон:

+-----+-------------+--------+
| id: | P_duration: | T_id:  |
+-----+-------------+--------+
| a   | 2           | a1     |
| e   | <null>      | <null> |
| h   | 5           | <null> |
+-----+-------------+--------+

Чат:

+-----+--------------+---------+
| id: |  C_duration: |  T_id:  |
+-----+--------------+---------+
| l   |            4 |    a2   |
+-----+--------------+---------+

Билет

+---------+
|    T_id |
+---------+
|    a1   |
|    a2   |
|    a3   |
+---------+

Я пытаюсь получить что-то вроде этого:

Результат:

+--------+-------------+-------------+--------+
|  id:   | P_duration: | C_duration: | T_id:  |
+--------+-------------+-------------+--------+
| a      | 2           | <null>      | a1     |
| e      | <null>      | <null>      | <null> |
| h      | 5           | <null>      | <null> |
| l      | <null>      | 4           | a2     |
| o      | <null>      | <null>      | <null> |
| <null> | <null>      | <null>      | a3     |
+--------+-------------+-------------+--------+

Я пытался с таким запросом

SELECT 
    conv.id, p.P_duration, c.C_duration, t.T_id
FROM 
    Conversations conv
LEFT JOIN 
    phone p ON p.id = conv.id
LEFT JOIN 
    chat c ON c.id = conv.id
LEFT JOIN 
    ticket t ON (t.T_id = p.T_id OR t.T_id = c.T_id)

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

Как мне изменить запрос?

Заранее спасибо

Ответы [ 2 ]

1 голос
/ 18 марта 2020

Я собираюсь предложить UNION ALL ввести билеты, которые не соответствуют таблицам phone и chat:

SELECT conv.id, p.P_duration, c.C_duration, t.T_id
FROM Conversations conv LEFT JOIN
     phone p
     ON p.id = conv.id LEFT JOIN
     chat c 
     ON c.id = conv.id LEFT JOIN
     ticket t 
     ON t.T_id IN (p.T_id, c.T_id)
UNION ALL
SELECT NULL, NULL, NULL, t.T_id
FROM ticket t
WHERE NOT EXISTS (SELECT 1
                  FROM phone p
                  WHERE t.T_id = p.T_id
                 ) AND
      NOT EXISTS (SELECT 1
                  FROM chat c
                  WHERE t.T_id = c.T_id
                 );
0 голосов
/ 18 марта 2020

Вы должны иметь возможность использовать ПОЛНОЕ СОЕДИНЕНИЕ при присоединении к таблице заявок.

select conv.id, p.P_duration, c.C_duration, t.T_id
FROM Conversations conv
LEFT JOIN phone p on p.id = conv.id
LEFT JOIN chat c on c.id = conv.id
FULL JOIN ticket t on (t.T_id= p.T_id or t.T_id= c.T_id)

Не уверены в производительности здесь. Подход UNION ALL может работать лучше.

...