Отсутствуют некоторые строки при использовании FULL OUTER JOIN

Я пытаюсь объединить две таблицы с помощью ПОЛНОГО ВНЕШНЕГО СОЕДИНЕНИЯ, но не получаю того, чего ожидал, потому что отсутствует строка.

Я пытаюсь объединить обе таблицы в 3 разных столбца.

Таблица А:

CallId      ASId    DateTime    CallStatus     DurationSeconds
21280070    NULL    17/07/2019  in_queue        1
21280070    2099726 17/07/2019  agent_dialing   3
21280070    2099726 17/07/2019  agent_ringing   3
21280070    2099726 17/07/2019  speaking_agent  95
21280070    NULL    17/07/2019  in_queue        1
21280070    2098692 17/07/2019  agent_dialing   1
21280070    2098692 17/07/2019  agent_ringing   6
21280070    2098692 17/07/2019  speaking_agent  10

Таблица B:

B.ASId  B.CallId    B.CallDetails                   B.DateTime  B.Duration
2099726 21280070    dialing                         17:21:41    3
2099726 21280070    ringing                         17:21:44    3
2099726 21280070    incoming_call_in_conversation   17:23:19    95
2098692 21280070    dialing                         17:23:21    1
2098692 21280070    ringing                         17:23:27    6
2098692 21280070    incoming_call_in_conversation   17:23:37    10
2098692 21280070    wrapup                          17:23:57    20

Я хочу получить что-то вроде этого:

A.CallId    A.ASId  A.DateTime  A.CallStatus    A.DurationSeconds       B.ASId  B.CallId    B.CallDetails   B.DateTime  B.Duration
21280070    NULL    17:21:38    in_queue        1                       NULL    NULL        NULL            NULL    NULL
21280070    2099726 17:21:41    agent_dialing   3                       2099726 21280070    dialing         17:21:41    3
21280070    2099726 17:21:44    agent_ringing   3                       2099726 21280070    ringing         17:21:44    3
21280070    2099726 17:23:19    speaking_agent  95                      2099726 21280070    incoming_call   17:23:19    95
21280070    NULL    17:23:20    in_queue        1                       NULL    NULL        NULL            NULL     NULL
21280070    2098692 17:23:21    agent_dialing   1                       2098692 21280070    dialing         17:23:21    1
21280070    2098692 17:23:27    agent_ringing   6                       2098692 21280070    ringing         17:23:27    6
21280070    2098692 17:23:37    speaking_agent  10                      2098692 21280070    incoming_call   17:23:37    10
NULL        NULL    NULL        NULL            NULL                    2098692 21280070    wrapup          17:23:57    20

Я пробовал следующий код:

SELECT *
FROM table a
FULL OUTER JOIN table b 
ON a.CallId = b.CallId AND a.ASId = b.ASId AND a.DateTime = b.DateTime
WHERE a.CallId = 21280070 
ORDER BY a.DateTime

И я получаю на одну строку меньше, чем ожидал, последняя с завершением:

A.CallId    A.ASId  A.DateTime  A.CallStatus    A.DurationSeconds       B.ASId  B.CallId    B.CallDetails   B.DateTime  B.Duration
21280070    NULL    17:21:38    in_queue        1                       NULL    NULL        NULL            NULL    NULL
21280070    2099726 17:21:41    agent_dialing   3                       2099726 21280070    dialing         17:21:41    3
21280070    2099726 17:21:44    agent_ringing   3                       2099726 21280070    ringing         17:21:44    3
21280070    2099726 17:23:19    speaking_agent  95                      2099726 21280070    incoming_call   17:23:19    95
21280070    NULL    17:23:20    in_queue        1                       NULL    NULL        NULL            NULL     NULL
21280070    2098692 17:23:21    agent_dialing   1                       2098692 21280070    dialing         17:23:21    1
21280070    2098692 17:23:27    agent_ringing   6                       2098692 21280070    ringing         17:23:27    6
21280070    2098692 17:23:37    speaking_agent  10                      2098692 21280070    incoming_call   17:23:37    10

Кто-нибудь знает, почему это происходит? Я не могу понять, почему не отображается последняя строка.

Спасибо заранее.

С уважением!


person Charlyjauskas    schedule 18.07.2019    source источник
comment
Узнайте, что возвращает FULL JOIN ON: INNER JOIN ON row UNION ВСЕ несопоставленные левые и правые строки таблицы, расширенные на NULL. Всегда знайте, какое ВНУТРЕННЕЕ СОЕДИНЕНИЕ вы хотите как часть ВНЕШНЕГО СОЕДИНЕНИЯ. WHERE или INNER JOIN ON, который требует, чтобы столбец таблицы right / left / both не был NULL после того, как OUTER JOIN ON удаляет любые строки из таблиц, расширенных NULL, т.е. оставляет только LEFT / RIGHT / INNER JOIN ON строках, т.е. превращает ВНЕШНЕЕ СОЕДИНЕНИЕ во ВНУТРЕННЕЕ СОЕДИНЕНИЕ. Это у тебя есть. (Это часто задаваемые вопросы.)   -  person philipxy    schedule 19.07.2019


Ответы (1)


Из-за a.CallId = 21280070. Потому что, когда JOIN не удается, a.CallId будет иметь значение NULL, и это предложение не будет истинным.

Предположительно вам, вероятно, понадобится одно из них:

WHERE 21280070 IN (a.CallId,b.CallId)

WHERE a.CallId = 21280070
   OR b.CallId = 21280070
person Larnu    schedule 18.07.2019
comment
О Господи! Большое спасибо, чувак! Ты прав! Какую глупую ошибку я совершил. Действительно ценится. - person Charlyjauskas; 18.07.2019